diff options
Diffstat (limited to 'info/texbytopic/TeXbyTopic.tex')
-rw-r--r-- | info/texbytopic/TeXbyTopic.tex | 19044 |
1 files changed, 19044 insertions, 0 deletions
diff --git a/info/texbytopic/TeXbyTopic.tex b/info/texbytopic/TeXbyTopic.tex new file mode 100644 index 0000000000..00152621b2 --- /dev/null +++ b/info/texbytopic/TeXbyTopic.tex @@ -0,0 +1,19044 @@ +\documentclass[twoside,letterpaper]{rapport3} + +%\nofiles + +\usepackage{comment,makeidx} + +\usepackage{times} +\renewcommand{\ttdefault}{cmtt} + +\usepackage[plainpages=true,pagebackref=true]{hyperref} + +\usepackage{german} +% german +\righthyphenmin=3 +\mdqoff +\captionsenglish +\makeindex + +\usepackage{fancyhdr} +% headers & footers +\pagestyle{fancy} +% foot +\lfoot[\thepage]{\protect\small\protect\it Victor Eijkhout -- \protect\TeX\ by Topic} +\rfoot[{\protect\small\protect\it Victor Eijkhout -- \protect\TeX\ by Topic}]{\thepage} +\cfoot{} +% head +\lhead[\let\\\relax \let\uppercase\relax \leftmark]{\relax} +\chead{} +\rhead[\relax]{\let\\\relax \let\uppercase\relax \rightmark} + +\newdimen\tempdima \newdimen\tempdimb + +% these are fine +\def\nl{\protect\\}\def\n#1{{\tt #1}}\def\cs#1{{\tt\char`\\#1}}\let\csc\cs +\def\lb{{\tt\char`\{}}\def\rb{{\tt\char`\}}} +\def\gr#1{$\langle$#1$\rangle$}\def\key#1{{\tt#1}} +\def\alt{}\def\altt{}%this way in manstijl +\def\ldash{\unskip\ --\nobreak\ \ignorespaces} +\def\rdash{\unskip\nobreak\ --\ \ignorespaces} +% check these +\def\hex{{\tt"}} +\def\ascii{{\sc ascii}} +\def\ebcdic{{\sc ebcdic}} +\def\IniTeX{Ini\TeX}\def\LamsTeX{LAMS\TeX}\def\VirTeX{Vir\TeX} +\def\AmsTeX{Ams\TeX} +\def\TeXbook{the \TeX\ book}\def\web{{\sc web}} +% needs major thinking +\newenvironment{disp}{\begin{quotation}}{\end{quotation}} +\newenvironment{Disp}{\begin{quotation}}{\end{quotation}} +\newenvironment{tdisp}{\begin{quotation}}{\end{quotation}} +\newenvironment{example}{\begin{quotation}}{\end{quotation}} +\newenvironment{inventory}{\begin{description}}{\end{description}} +\newenvironment{glossinventory}{\begin{description}}{\end{description}} +\def\gram#1{\gr{#1}}%??? +% +% index +% +\def\term#1\par{\index{#1}} +\def\howto#1\par{} +\def\cstoidx#1\par{\index{#1@\cs{#1}@}} +\def\csterm#1\par{\cstoidx #1\par\cs{#1}} +\def\csidx#1{\cstoidx #1\par\cs{#1}} + +\begin{document} + +\def\tmc{\tracingmacros=2 \tracingcommands\tracingmacros} + +%%%%%%%%%%%%%%%%%%% +\makeatletter +\def\snugbox{\hbox\bgroup\setbox\z@\vbox\bgroup + \leftskip\z@ + \bgroup\aftergroup\make@snug + \let\next=} +\def\make@snug{\par\sn@gify\egroup \box\z@\egroup} +\def\sn@gify + {\skip\z@=\lastskip \unskip + \advance\skip\z@\lastskip \unskip + \unpenalty + \setbox\z@\lastbox + \ifvoid\z@ \nointerlineskip \else {\sn@gify} \fi + \hbox{\unhbox\z@}\nointerlineskip + \vskip\skip\z@ + } + +\def\figfont{\SansSerif \PointSize:8 \Style:roman } + +\newdimen\fbh \fbh=60pt % dimension for easy scaling: +\newdimen\fbw \fbw=60pt % height and width of character box + +\newdimen\dh \newdimen\dw % height and width of current character box +\newdimen\lh % height of previous character box +\newdimen\lw \lw=.4pt % line weight, instead of default .4pt + +\def\hdotfill{\noindent + \leaders\hbox{\vrule width 1pt height\lw + \kern4pt + \vrule width.5pt height\lw}\hfill\hbox{} + \par} +\def\hlinefill{\noindent + \leaders\hbox{\vrule width 5.5pt height\lw }\hfill\hbox{} + \par} +\def\stippel{$\qquad\qquad\qquad\qquad$} +\makeatother +%%%%%%%%%%%%%%%%%%% + +\begin{comment} +\def\SansSerif{\Typeface:macHelvetica } +\def\SerifFont{\Typeface:macTimes } +\def\SansSerif{\Typeface:bsGillSans } +\def\SerifFont{\Typeface:bsBaskerville } +\end{comment} +\let\SansSerif\relax \def\italic{\it} +\let\SerifFont\relax \def\MainFont{\rm} +\let\SansSerif\relax +\let\SerifFont\relax +\let\PopIndentLevel\relax \let\PushIndentLevel\relax +\let\ToVerso\relax \let\ToRecto\relax + +\begin{comment} +\def\stop@command@suffix{stop} +\let\PopListLevel\PopIndentLevel +\let\FlushRight\relax +\let\flushright\FlushRight +\let\SetListIndent\LevelIndent +\def\awp{\ifhmode\vadjust{\penalty-10000 }\else + \penalty-10000 \fi} +\end{comment} +\let\awp\relax +\let\PopIndentLevel\relax \let\PopListLevel\relax + +\showboxdepth=-1 + +\def\endofchapter{\vfill\noindent} + +\title{\TeX\ by Topic, A \TeX nician's Reference} +\date{} +\author{Victor Eijkhout} +\maketitle + \begin{minipage}[h]{1.0\linewidth} + Copyright \copyright\ 2007 Victor Eijkhout.\\ + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled "GNU + Free Documentation License". +\medskip +This document is based on the book \TeX\ by Topic, +copyright 1991-2007 Victor Eijkhout. This book was +printed in~1991 by Addison-Wesley UK, ISBN 0-201-56882-9, reprinted +in~1993, pdf version first made freely available in~2001. + \end{minipage} + +\tableofcontents + +\pagebreak +\addcontentsline{toc}{section}{License} +\paragraph*{\bf License} +GNU Free Documentation License + +Version 1.2, November 2002 + + Copyright \copyright\ 2000,2001,2002 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; it +can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, refers +to any such manual or work. Any member of the public is a licensee, +and is addressed as "you". You accept the license if you copy, modify +or distribute the work in a way requiring permission under copyright +law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may be +at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify you +as the publisher of these copies. The front cover must present the +full title with all words of the title equally prominent and visible. +You may add other material on the covers in addition. Copying with +changes limited to the covers, as long as they preserve the title of +the Document and satisfy these conditions, can be treated as verbatim +copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions (which +should, if there were any, be listed in the History section of the +Document). You may use the same title as a previous version if the +original publisher of that version gives permission. B. List on the +Title Page, as authors, one or more persons or entities responsible +for authorship of the modifications in the Modified Version, together +with at least five of the principal authors of the Document (all of +its principal authors, if it has fewer than five), unless they release +you from this requirement. C. State on the Title page the name of the +publisher of the Modified Version, as the publisher. D. Preserve all +the copyright notices of the Document. E. Add an appropriate +copyright notice for your modifications adjacent to the other +copyright notices. F. Include, immediately after the copyright +notices, a license notice giving the public permission to use the +Modified Version under the terms of this License, in the form shown in +the Addendum below. G. Preserve in that license notice the full lists +of Invariant Sections and required Cover Texts given in the Document's +license notice. H. Include an unaltered copy of this License. I. +Preserve the section Entitled "History", Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If there +is no section Entitled "History" in the Document, create one stating +the title, year, authors, and publisher of the Document as given on +its Title Page, then add an item describing the Modified Version as +stated in the previous sentence. J. Preserve the network location, if +any, given in the Document for public access to a Transparent copy of +the Document, and likewise the network locations given in the Document +for previous versions it was based on. These may be placed in the +"History" section. You may omit a network location for a work that was +published at least four years before the Document itself, or if the +original publisher of the version it refers to gives permission. K. +For any section Entitled "Acknowledgements" or "Dedications", Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. L. Preserve all the Invariant Sections of +the Document, unaltered in their text and in their titles. Section +numbers or the equivalent are not considered part of the section +titles. M. Delete any section Entitled "Endorsements". Such a section +may not be included in the Modified Version. N. Do not retitle any +existing section to be Entitled "Endorsements" or to conflict in title +with any Invariant Section. O. Preserve any Warranty Disclaimers. If +the Modified Version includes new front-matter sections or appendices +that qualify as Secondary Sections and contain no material copied from +the Document, you may at your option designate some or all of these +sections as invariant. To do this, add their titles to the list of +Invariant Sections in the Modified Version's license notice. These +titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements." + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided for under this License. Any other attempt +to copy, modify, sublicense or distribute the Document is void, and +will automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +http://www.gnu.org/copyleft/. + +Each version of the License is given a distinguishing version +number. If the Document specifies that a particular numbered version +of this License "or any later version" applies to it, you have the +option of following the terms and conditions either of that specified +version or of any later version that has been published (not as a +draft) by the Free Software Foundation. If the Document does not +specify a version number of this License, you may choose any version +ever published (not as a draft) by the Free Software Foundation. + +\pagebreak +\paragraph*{\bf Preface} +To the casual observer, \TeX\ +is not a state-of-the-art typesetting system. +No flashy multilevel menus and interactive manipulation +of text and graphics dazzle the onlooker. +On a less superficial level, however, \TeX\ is a very sophisticated +program, first of all because of the ingeniousness of its +built-in algorithms for such things as paragraph breaking +and make-up of mathematical formulas, and +second because of its almost complete programmability. +The combination of these factors makes it possible for \TeX\ +to realize almost every imaginable layout in a highly automated +fashion. + +Unfortunately, it also means that \TeX\ has an +unusually large number of commands and parameters, +and that programming \TeX\ can be far from easy. +Anyone wanting to program in \TeX, and maybe +even the ordinary user, would seem to need two books: +a~tutorial that gives a first glimpse of the many +nuts and bolts of \TeX, and after that +a~systematic, complete reference manual. +This book tries to fulfil the latter function. +A~\TeX er who has already made a start +(using any of a number of introductory books +on the market) +should be able to use this book indefinitely thereafter. + +In this volume the universe of \TeX\ is presented as +about forty different subjects, each in a separate +chapter. +Each chapter starts out with a list of control sequences +relevant to the topic of that chapter +and proceeds to treat the +theory of the topic. +Most chapters conclude with remarks and examples. + +Globally, the chapters are ordered as follows. +The chapters on basic mechanisms are first, +the chapters on text treatment and mathematics are next, +and finally there are some +chapters on output and aspects of \TeX's connections to +the outside world. +% +The book also contains a glossary of \TeX\ +commands, tables, +and indexes by example, by control sequence, and by subject. +The subject index refers for most concepts to +only one page, where most of the information +on that topic can be found, as well as references +to the locations of related information. + +This book does not treat any specific \TeX\ macro package. +Any parts of the plain format that are treated are those +parts that belong to the `core' of plain \TeX: they +are also present in, for instance, \LaTeX. +Therefore, most remarks about the plain format +are true for \LaTeX, as well as most other formats. +Putting it differently, +if the text refers to the plain format, this should be taken +as a contrast to pure \IniTeX, not to \LaTeX. +By way of illustration, occasionally macros from plain \TeX\ +are explained that do not belong to the core. + +\medskip\noindent +{\bf Acknowledgment}\nl +I am indebted to Barbara Beeton, Karl Berry, and Nico Poppelier, +who read previous versions of this book. Their comments +helped to improve the presentation. +Also I~would like to thank the participants of +the discussion lists \TeX hax, \TeX-nl, and {\tt comp.text.tex}. +Their questions and answers gave me much food for thought. +Finally, any acknowledgement in a book about \TeX\ ought to +include Donald Knuth for inventing \TeX\ in the +first place. This book is no exception. + +\begin{flushright} + Victor Eijkhout\\ + Urbana, Illinois, August 1991\\ + Knoxville, Tennessee, May 2001 +\end{flushright} +\pagebreak + +\chapter{The Structure of the \TeX\ Processor} + +This book treats the various aspects of \TeX\ in chapters +that are concerned with relatively small, well-delineated, +topics. In this chapter, therefore, +a global picture of the way \TeX\ operates will be given. +Of necessity, many details will be omitted here, but all of +these are treated in later chapters. On the other hand, +the few examples given in this chapter will be repeated +in the appropriate places later on; they are included here +to make this chapter self-contained. + +%\point Four \TeX\ processors +\section{Four \TeX\protect\ processors} + +The way \TeX\ processes its input can be viewed as +happening on four levels. One might say that +the \TeX\ processor is split into four separate units, +each one accepting the output of the previous stage, and +delivering the input for the next stage. The input of +the first stage is then the \n{.tex} input file; the output +of the last stage is a \n{.dvi} file. + +For many purposes it is most convenient, and most insightful, +to consider these four levels of processing as happening +after one another, each one accepting the {\em completed\/} +output of the previous level. In reality this is not true: +all levels are simultaneously +active, and there is interaction between them. + +The four levels are (corresponding roughly +to the `eyes', `mouth', `stomach', and `bowels' respectively +in Knuth's original terminology) as follows. +\begin{enumerate}\item +The input processor. This is the piece of \TeX\ that +accepts input lines from the file system of whatever computer +\TeX\ runs on, and turns them into tokens. +Tokens are the internal objects of \TeX: +there are character tokens that constitute the typeset +text, and control sequence tokens that are commands +to be processed by the next two levels. +\item The expansion processor. +Some but not all of the tokens generated in the first level +\ldash macros, conditionals, and a number +of primitive \TeX\ commands \rdash are subject to expansion. +Expansion is the process that replaces some (sequences of) +tokens by other (or no) tokens. +\item The execution processor. +Control sequences that are not expandable are executable, +and this execution takes place on the third level of the +\TeX\ processor. + +One part of the activity here concerns changes to +\TeX's internal state: assignments (including +macro definitions) are typical activities in this +\awp +category. The other major thing happening on this level +is the construction of horizontal, vertical, and +mathematical lists. +\item The visual processor. +In the final level of processing +the visual part of \TeX\ processing is performed. Here +horizontal lists are broken into paragraphs, +vertical lists are broken into pages, +and formulas are built out of math lists. +Also the output to the \n{dvi} file takes place on this level. +The algorithms working here are not accessible to the user, +but they can be influenced by a number of parameters. +\end{enumerate} + +%\point The input processor +\section{The input processor} + +The input processor of \TeX\ is that part of \TeX\ that +translates whatever characters it gets from the input file +into tokens. The output of this processor is a stream +of tokens: a token list. Most tokens fall into one of two categories: +character tokens and control sequence tokens. +The remaining category is that of the parameter tokens; +these will not be treated in this chapter. + +%\spoint Character input +\subsection{Character input} + +For simple input text, characters are made into +character tokens. However, \TeX\ can ignore input characters: +a row of spaces in the input is usually equivalent to just one +space. Also, \TeX\ itself can insert tokens that do not correspond +to any character in the input, for instance the space token +at the end of the line, or the \cs{par} token after an empty line. + +Not all character tokens signify characters to be typeset. +\altt +Characters fall into sixteen categories \ldash each one +specifying a certain function that a character can have \rdash +of which only two contain the characters that will be +typeset. The other categories contain such characters +as~\n{\char`\{}, \n{\char`\}}, +\n\&, and~\n\#. A~character token can be considered +as a pair of numbers: the character code \ldash typically the \ascii\ +code \rdash and the category code. +It is possible to change +the category code that is associated with a particular +character code. + +When the escape character (by default~\cs{}$\,$) appears in the input, +\TeX's behaviour in forming tokens is more complicated. +Basically, +\TeX\ builds a control sequence by taking a number of characters +from the input and lumping them together into a single token. + +The behaviour with which \TeX's input processor +reacts to category codes can be described +as a machine that switches between three internal states: +$N$,~new line; $M$,~middle of line; $S$,~skipping spaces. +These states and the transitions between them are treated +in Chapter~\ref{mouth}. + +%\spoint Two-level input processing +\subsection{Two-level input processing} + +\TeX's input processor is in fact itself a two-level processor. +Because of limitations of the terminal, the editor, or the operating +\awp +system, the user may not be able to input certain desired characters. +Therefore, \TeX\ provides a mechanism to access +with two superscript characters all of the available character +positions. This may be considered +a separate stage of \TeX\ processing, taking place +prior to the three-state machine mentioned above. + +For instance, the sequence \verb>^^+> is replaced by~\n{k} because +the \ascii{} codes of \n k and \n + differ by~64. +Since this replacement takes place before tokens are formed, +writing \verb>\vs^^+ip 5cm> has the same effect as +\verb>\vskip 5cm>. Examples more useful than this exist. + +Note that this first stage is a transformation from +characters to characters, without considering category +codes. These come into play only in the second phase +of input processing where characters are converted +to character tokens by coupling the category code +to the character code. + +%\point The expansion processor +\section{The expansion processor} + +\TeX's expansion processor accepts a stream of tokens +and, if possible, +expands the tokens in this stream one by one +until only unexpandable tokens remain. +Macro expansion is the clearest example of this: +if a control sequence is a macro name, it is replaced +(together possibly with parameter tokens) by +the definition text of the macro. + +Input for the expansion processor is provided mainly +by the input processor. The stream of tokens coming +from the first stage of \TeX\ processing is subject +to the expansion process, and the result is a stream +of unexpandable tokens which is fed to the execution processor. + +However, the expansion processor comes into play +also when (among others) an \cs{edef} or \cs{write} is processed. +The parameter token list of these commands is +expanded very much as if the lists had been +on the top level, instead of the argument to a command. + +%\spoint The process of expansion +\subsection{The process of expansion} + +Expanding a token consists of the following steps: +\begin{enumerate} +\item See whether the token is expandable. +\item If the token is unexpandable, pass it to the token + list currently being built, and take on the next token. + +\item If the token is expandable, replace it by its expansion. + For macros without parameters, and a few primitive commands + such as \cs{jobname}, this is indeed a simple replacement. + Usually, however, \TeX\ needs to absorb some argument tokens from + the stream in order to be able to form the replacement + of the current token. + For instance, if the token was a macro with parameters, + sufficiently many tokens need to be absorbed to form + the arguments corresponding to these parameters. + +\item Go on expanding, starting with the first token of the + expansion. +\end{enumerate} +% +Deciding whether a token is expandable is +a simple decision. Macros and active characters, +conditionals, and a number of primitive \TeX\ commands +\awp +(see the list on page~\pageref{expand:lijst}) +are expandable, other tokens are not. +Thus the expansion processor replaces macros by their expansion, +it evaluates conditionals and eliminates any irrelevant parts of +these, but tokens such as \cs{vskip} and character tokens, +including characters such as dollars and braces, are passed untouched. +%\endinput +%\spoint Special cases: \cs{expandafter}, \cs{noexpand}, and \cs{the} +\subsection{Special cases: \cs{expandafter}, \cs{noexpand}, and \cs{the}} + +As stated above, +after a token has been expanded, \TeX\ will start expanding +the resulting tokens. At first sight the \cs{expandafter} +command would seem to be an exception to this rule, because +it expands only one step. What actually happens is that +the sequence \begin{disp}\cs{expandafter}\gr{token$_1$}\gr{token$_2$}\end{disp} +is replaced by +\begin{disp}\gr{token$_1$}\gr{\italic expansion of token$_2$}\end{disp} +and this replacement is in fact reexamined by the expansion +processor. + +Real exceptions do exist, however. If the +current token is the \cs{noexpand} command, the next +token is considered for the moment to be unexpandable: +it is handled as if it were \cs{relax}, and it is +passed to the token list being built. + +For example, +in the macro definition +\begin{verbatim} +\edef\a{\noexpand\b} +\end{verbatim} +the replacement text \verb>\noexpand\b> is expanded at definition +time. The expansion of \cs{noexpand} is the next token, with +a temporary meaning of \cs{relax}. Thus, when the expansion +processor tackles the next token, the~\cs{b}, it will consider +that to be unexpandable, and just pass it to the token list +being built, which is the replacement text of the macro. + +Another exception is that the tokens +resulting from \cs{the}\gr{token variable} +are not expanded further if this statement occurs +inside an \cs{edef} macro definition. + +%\spoint Braces in the expansion processor +\subsection{Braces in the expansion processor} + +Above, it was said that braces are passed as unexpandable +character tokens. In general this is true. For instance, +the \cs{romannumeral} command is handled by the expansion +processor; when confronted with +\begin{verbatim} +\romannumeral1\number\count2 3{4 ... +\end{verbatim} +\TeX\ will expand until the brace is encountered: +if \cs{count2} has the value of zero, the result will be +the roman numeral representation of~\n{103}. + +As another example, \begin{verbatim} +\iftrue {\else }\fi +\end{verbatim} +is handled by the expansion processor +completely analogous to +\begin{disp}\cs{iftrue} {\italic a}\cs{else} {\italic b}\cs{fi}\end{disp} +\awp +The result is a character token, independent of its category. + +However, in the context of macro expansion +the expansion processor will +recognize braces. +First of all, a balanced pair of braces marks off a group of tokens +to be passed as one argument. +If a macro has an argument \begin{verbatim} +\def\macro#1{ ... } +\end{verbatim} +one can call it with a single token, as in +\begin{verbatim} +\macro 1 \macro \$ +\end{verbatim} +or with a group of tokens, surrounded by braces +\begin{verbatim} +\macro {abc} \macro {d{ef}g} +\end{verbatim} + + +Secondly, when the arguments for a macro with +parameters are read, no expressions with unbalanced braces +are accepted. In +\begin{verbatim} +\def\a#1\stop{ ... } +\end{verbatim} +the argument consists of all +tokens up to the first occurrence of \cs{stop} +that is not in braces: in +\begin{verbatim} +\a bc{d\stop}e\stop +\end{verbatim} +the argument of~\cs{a} is \verb>bc{d\stop}e>. +Only balanced expressions +are accepted here. + +%\point The execution processor +\section{The execution processor} + +The execution processor builds lists: horizontal, vertical, +and math lists. Corresponding to these lists, it works +in horizontal, vertical, or math mode. Of these three modes +`internal' and `external' variants exist. +In addition to building lists, this part of the \TeX\ processor +also performs mode-independent processing, such as +assignments. + +Coming out of the expansion processor is a stream of +unexpandable tokens to be processed by +the execution processor. +\relax From the point of view of the execution processor, this +stream contains two types of tokens: +\begin{itemize} +\item Tokens signalling an assignment (this includes + macro definitions), and + other tokens signalling actions + that are independent of the mode, such + as \cs{show} and \cs{aftergroup}. +\item Tokens that build lists: + characters, boxes, and glue. The way they are handled + depends on the current mode. +\end{itemize} + +Some objects can be used in any mode; for instance boxes +can appear in horizontal, vertical, and math lists. +The effect of such an object will of course still depend on the mode. +Other objects are specific for one mode. +For instance, characters (to be more precise: +character tokens of categories 11 and~12), +are intimately connected to horizontal mode: +if the execution processor +is in vertical mode when it encounters a character, it will +switch to horizontal mode. + +Not all character tokens signal characters to be typeset: +the execution processor can also encounter math shift +\awp +characters (by default~\n{\char`\$}) and beginning/end of group +characters (by default \n{\char`\{} and~\n{\char`\}}). +Math shift characters let \TeX\ enter or exit +math mode, and braces let it enter or exit a~new level of +grouping. + +One control sequence handled by the execution processor +deserves special mention: \cs{relax}. +This control sequence is not expandable, but the execution +is to do nothing. Compare the effect of \cs{relax} in +\begin{verbatim} +\count0=1\relax 2 +\end{verbatim} +with that of \cs{empty} +defined by \begin{verbatim} +\def\empty{} +\end{verbatim} +in +\begin{verbatim} +\count0=1\empty 2 +\end{verbatim} +In the first case the expansion +process that is forming the number stops at \cs{relax} and +the number {\tt 1} is assigned; in the second case +\cs{empty} expands to nothing, so {\tt 12} is assigned. + +%\point The visual processor +\section{The visual processor} + +\TeX's output processor encompasses those algorithms that +are outside direct user control: paragraph breaking, +alignment, page breaking, math typesetting, and \n{dvi} file +generation. Various parameters control the operation +of these parts of \TeX. + +Some of these algorithms return their results in a form that +can be handled by the execution processor. For instance, +a paragraph that has been broken into lines is added to +the main vertical list as a sequence of horizontal boxes +with intermediate glue and penalties. Also, the page breaking +algorithm stores its result in \cs{box255}, so output +routines can dissect it. On the other hand, a math formula +can not be broken into pieces, and, naturally, +shipping a box to the \n{dvi} file is irreversible. + +%\point Examples +\section{Examples} + +%\spoint Skipped spaces +\subsection{Skipped spaces} + +Skipped spaces provide an illustration of the view that +\TeX's levels of processing accept the completed input +of the previous level. Consider the commands +\begin{verbatim} +\def\a{\penalty200} +\a 0 +\end{verbatim} +This is {\italic not\/} equivalent to +\begin{verbatim} +\penalty200 0 +\end{verbatim} +\awp +which would place a penalty of \n{200}, and +typeset the digit~\n0. Instead it expands to +\begin{verbatim} +\penalty2000 +\end{verbatim} +because the space after \cs{a} is skipped in the +input processor. Later stages of processing then receive +the sequence \begin{verbatim} +\a0 +\end{verbatim} + +%\spoint Internal quantities and their representations +\subsection{Internal quantities and their representations} + +\TeX\ uses various sorts of internal quantities, +such as integers and dimensions. These internal +quantities have an external representation, +which is a string of characters, such as +\n{4711} or~\n{91.44cm}. + +Conversions between the internal value and the external +representation take place on two different levels, +depending on what direction the conversion goes. +A~string of characters is converted to an internal +value in assignments such as +\begin{verbatim} +\pageno=12 \baselineskip=13pt +\end{verbatim} +or statements such as +\begin{verbatim} +\vskip 5.71pt +\end{verbatim} +and all of these statements are handled by the execution +processor. + +On the other hand, the conversion of the internal +values into a representation as a string of +characters is handled by the expansion processor. +For instance, \begin{verbatim} +\number\pageno \romannumeral\year +\the\baselineskip +\end{verbatim} +are all processed by expansion. + +As a final example, suppose \verb>\count2=45>, and +consider the statement +\begin{verbatim} +\count0=1\number\count2 3 +\end{verbatim} +The expansion processor tackles \verb>\number\count2> +to give the characters \n{45}, and the space after +the \n 2 does not end the number being assigned: +it only serves as a delimiter +of the number of the \cs{count} register. +In the next stage of processing, the execution processor +will then see the statement +\begin{verbatim} +\count0=1453 +\end{verbatim} +and execute this. + +%\endinput + +%%%% end of input file [bigpic] + +%\InputFile:mouth +%%%% this is input file [mouth] +%\tracingmacros=2 \tracingcommands\tracingmacros +%\subject[mouth] Category Codes \nl and Internal States +\endofchapter +\chapter{Category Codes and Internal States}\label{mouth} + +When characters are read, +\TeX\ assigns them +category codes. The reading mechanism has three internal +states, and transitions between these states are effected +by category codes of characters in the input. +This chapter describes how \TeX\ reads its input and +how the category codes of characters influence the +reading behaviour. Spaces and line ends are discussed. + +\begin{inventory} +\item [\cs{endlinechar}] + The character code of the end-of-line character + appended to input lines. + \IniTeX\ default:~13. +\item [\cs{par}] + Command to close off a paragraph and go into vertical mode. + Is generated by empty lines. + +\item [\cs{ignorespaces}] + Command that reads and expands until something is + encountered that is not a \gr{space token}. + +\item [\cs{catcode}] + Query or set category codes. + +\item [\cs{ifcat}] + Test whether two characters have the same category code. + +\item [\cs{\char32}] + Control space. + Insert the same amount of space that a space token would + when \cs{spacefactor}${}=1000$. + +\item [\cs{obeylines}] + Macro in plain \TeX\ to make line ends significant. + +\item [\cs{obeyspaces}] + Macro in plain \TeX\ to make (most) spaces significant. +\end{inventory} + +%\point Introduction +\section{Introduction} + +\TeX's input processor scans input lines from a file or terminal, and +makes tokens out of the characters. +The input processor can be viewed as +a simple finite state automaton with three internal states; +depending on the state its scanning behaviour may differ. +This automaton will be treated here both from the point of view of the +internal states and of the category codes governing the +transitions. + +%\point Initial processing +\section{Initial processing} + +Input from a file (or from the user terminal, but this +will not be mentioned specifically +most of the time) is handled one line at a time. +Here follows a discussion of what exactly is an input line +for \TeX. + +Computer systems differ with respect to +\term line! input\par\term line! end\par\term machine independence\par +the exact definition of an input +\mdqon +line. The carriage return/""line feed +\mdqoff +\awp +\message{slash-dash}% +sequence terminating a line is most common, +but some systems use just a line feed, and +some systems with fixed record length (block) storage do not have +a line terminator at all. Therefore \TeX\ has its +own way of terminating an input line. + +\begin{enumerate} +\item An input line is read from an input file (minus the +line terminator, if any). +\item Trailing spaces are removed (this is for the systems +with block storage, and it prevents confusion because these +spaces are hard to see in an editor). +\item The \cstoidx endlinechar\par, by default \gram{return} +(code~13) is appended. +If the value of \cs{endlinechar} is negative +\label{append:elc}% +or more than~255 (this was 127 in versions of \TeX\ older +than version~3; see page~\pageref{2vs3} for more differences), +no character is appended. +The effect then is the same as +if the line were to end with a comment character. +\end{enumerate} + + +Computers may also differ in the character encoding +(the most common schemes are \ascii{} and \ebcdic{}), so \TeX\ +converts the characters that are read from the file to its +own character codes. These codes are then used exclusively, +so that \TeX\ will perform the same on any system. +For more on this, see Chapter~\ref{char}. + +%\point Category codes +\section{Category codes} + +Each of the 256 character codes (0--255) has an +\term category codes\par +associated category code, though not necessarily always the same one. +There are 16 categories, numbered 0--15. +When scanning the input, \TeX\ +thus forms character-code--category-code pairs. +The input processor sees only these pairs; from them are formed +character tokens, control sequence tokens, and parameter tokens. +These tokens are then passed to \TeX's expansion and execution +processes. + +A~character token is a character-code--category-code +pair that is passed unchanged. +A~control sequence token consists of one or more characters +preceded by an escape character; see below. +Parameter tokens are also explained below. + +This is the list of the categories, together with a brief +description. More elaborate explanations follow in this and +later chapters. +\begin{enumerate} \message{set counter}%\SetCounter:item=-1 +\setcounter{enumi}{-1} +\item\label{ini:esc} Escape character; this signals the start of a control + sequence. \IniTeX\ makes the backslash \verb-\- (code~92) + an escape character. +\item Beginning of group; such a character causes \TeX\ to enter a new + level of grouping. The plain format makes the open brace \verb-{- +\mdqon + a beginning"-of-group character. +\mdqoff +\item End of group; \TeX\ closes the current level of grouping. + Plain \TeX\ has the closing brace \verb-}- as end-of-group + character. +\item Math shift; this is the opening and closing delimiter for + math formulas. Plain \TeX\ uses the dollar sign~\verb-$- + for this. +\item Alignment tab; the column (row) separator in tables + made with \cs{halign} (\cs{valign}). In plain + \TeX\ this is the ampersand~\verb-&-. +\item\label{ini:eol} End of line; a character that \TeX\ considers + to signal the + end of an input line. + \IniTeX\ assigns this code to the \gram{return}, that is, code~13. + Not coincidentally, 13~is also the value that \IniTeX\ + assigns to the \cs{endlinechar} parameter; see above. +\awp +\item Parameter character; this indicates parameters for macros. + In plain \TeX\ this is the hash sign~\verb-#-. +\item Superscript; this precedes superscript expressions + in math mode. It is also used to denote character + codes that cannot + be entered in an input file; see below. + In plain \TeX\ this is the circumflex~\verb-^-. +\item Subscript; this precedes subscript expressions in math mode. + In plain \TeX\ the underscore~\verb-_- is used for this. +\item Ignored; characters of this category are removed + from the input, and have therefore no influence on + further \TeX\ processing. In plain \TeX\ this is + the \gr{null} character, that is, code~0. +\item\label{ini:sp} Space; space characters receive special treatment. + \IniTeX\ assigns this category to the \ascii{} \gr{space} + character, code~32. +\item\label{ini:let} Letter; in \IniTeX\ only the characters \n{a..z}, \n{A..Z} + are in this category. Often, macro packages make + some `secret' character (for instance~\n@) into a letter. +\item\label{ini:other} Other; \IniTeX\ puts everything that is + not in the other categories into this category. Thus + it includes, for instance, digits and punctuation. +\item Active; active characters function as a \TeX\ command, + without being preceded by an escape character. + In plain \TeX\ this is only the tie character~\verb-~-, + which is defined to produce + an unbreakable space; see page~\pageref{tie}. +\item\label{ini:comm} Comment character; from a comment character onwards, + \TeX\ considers the rest of an input line to be + comment and ignores it. In \IniTeX\ the per cent sign \verb-%- + is made a comment character. +\item\label{ini:invalid} Invalid character; this category is for characters that + should not appear in the input. \IniTeX\ assigns the + \ascii\ \gr{delete} character, code~127, to this category. +\end{enumerate} + +The user can change the mapping +of character codes to category codes +with the \cstoidx catcode\par\ command (see Chapter~\ref{gramm} +for the explanation of concepts such as~\gr{equals}): +\begin{disp}\cs{catcode}\gram{number}\gr{equals}\gram{number}.\end{disp} +In such a statement, the first number is often given in the form +\begin{disp}\verb>`>\gr{character}\quad or\quad \verb>`\>\gr{character}\end{disp} +both of which denote the character code of the character +(see pages \pageref{char:code} and~\pageref{int:denotation}). + +The plain format defines +\csterm active\par +\begin{verbatim} +\chardef\active=13 +\end{verbatim} +so that one can write statements such as +\begin{verbatim} +\catcode`\{=\active +\end{verbatim} +The \cs{chardef} command is treated +on pages \pageref{chardef} and~\pageref{num:chardef}. + +The \LaTeX\ format has the control sequences +\begin{verbatim} +\def\makeatletter{\catcode`@=11 } +\def\makeatother{\catcode`@=12 } +\end{verbatim} +in order to switch on and off the `secret' character~\n@ +(see below). +\awp + +The \cs{catcode} command can also be used to query category +codes: in \begin{verbatim} +\count255=\catcode`\{ +\end{verbatim} +it yields a number, which can be assigned. + +Category codes can be tested by +\begin{disp}\cs{ifcat}\gr{token$_1$}\gr{token$_2$}\end{disp} +\TeX\ expands whatever is after \cs{ifcat} until two +unexpandable tokens are found; these are then compared +with respect to their category codes. Control sequence +tokens are considered to have category code~16, +which makes them all equal to each other, and unequal to +all character tokens. +Conditionals are treated further in Chapter~\ref{if}. + +%\point From characters to tokens +\section{From characters to tokens} + +The input processor +of \TeX\ scans input lines from a file or from the +user terminal, and converts the characters in the input +to tokens. There are three types of tokens. +\begin{itemize}\item Character tokens: any character that is + passed on its own to \TeX's +further levels of processing with an appropriate +category code attached. +\item Control sequence tokens, of which there are two kinds: + an escape character +\ldash that is,\message{ldash nobreak?} +a character of category~0 \rdash followed +by a string of `letters' is +lumped together into a {\em control word}, which is a single token. +An escape character followed by a single character that is not of +category~11, letter, is made into a +{\em control symbol}\term control! symbol\par. +If the distinction between control word and control symbol is +irrelevant, both are called +{\em control sequences}\term control! sequence\par. + +The control symbol that results from an escape character followed +\csterm \char32\par +by a space character is called +{\em control space}\term control! space\par. + +\item Parameter tokens: a parameter character + \ldash that is, a character of category~6, by default~\verb=#= \rdash +followed by a digit \n{1..9} is replaced by a parameter token. +Parameter tokens are allowed only in the context of +macros (see Chapter~\ref{macro}). + +A macro parameter character followed by another macro parameter +character (not necessarily with the same character code) +is replaced by a single character token. +This token has category~6 (macro parameter), and the character +code of the second parameter character. +The most common instance is of this is +replacing \n{\#\#} by~\n{\#$_6$}, where the subscript +denotes the category code. + +\end{itemize} + +%\point[input:states] The input processor as a finite state automaton +\section{The input processor as a finite state automaton} +\label{input:states} + +\TeX's input processor can be considered to be a finite state +automaton with three internal states, +that is, at any moment in time it is in one of three states, +\term state! internal\par +and after transition to another state there is no memory of the +\awp +previous states. + +%\spoint State {\italic N}: new line +\subsection{State {\italic N}: new line} + +State {\italic N} is entered at the beginning of each new input line, +and that is the only time \TeX\ is in this state. +In state~{\italic N} all space tokens (that is, characters of category~10) +are ignored; an end-of-line character is converted +into a \cs{par} token. +All other tokens bring \TeX\ into state~{\italic M}. + +%\spoint State {\italic S}: skipping spaces +\subsection{State {\italic S}: skipping spaces} + +State {\italic S} is entered in any mode after a control word or +control space (but after no other control symbol), +or, when in state~{\italic M}, after a space. +In this state all subsequent spaces or end-of-line characters +in this input line are discarded. + +%\spoint State {\italic M}: middle of line +\subsection{State {\italic M}: middle of line} + +By far the most common state is~{\italic M}, `middle of line'. +It is entered after characters of categories +1--4, 6--8, and 11--13, and after control symbols +other than control space. +An end-of-line character encountered in this state +results in a space token. + +\input figflow \message{left align flow diagram} +\vskip12pt plus 1pt minus 4pt\relax %before spoint skip +\begin{tdisp}%\PopIndentLevel +\leavevmode\relax +%\figmouth +\message{fig mouth missing} +\end{tdisp} + + +%\point[hathat] Accessing the full character set +\section{Accessing the full character set} +\label{hathat} + +Strictly speaking, \TeX's input processor +is not a finite state automaton. +This is because during the scanning of the input line +all trios consisting of two {\sl equal\/} superscript characters +\term \char94\char94\ replacement\par +(category code~7) and a subsequent character +(with character code~$<128$) +are replaced by a single character with a character +code in the range 0--127, +differing by 64 from that of the original character. + +This mechanism can be used, for instance, to access positions in a font +corresponding to character codes that cannot +be input, for instance because they are \ascii{} control characters. +The most obvious examples are the \ascii{} \gr{return} +and \gr{delete} characters; the corresponding +positions 13 and 127 in a font are +accessible as \verb>^^M> and~\verb>^^?>. +However, since the category of \verb>^^?> is 15, invalid, +that has to be changed before character 127 can be accessed. +\awp + +In \TeX3 this mechanism has been +modified and extended to access 256 characters: +any quadruplet \verb-^^xy- where both \n x and \n y are lowercase +hexadecimal digits \n0--\n9, \n a--\n f, +is replaced by a character in the +range 0--255, namely the character the number of which is +represented hexadecimally as~\n{xy}. +This imposes a slight restriction on the applicability +of the earlier mechanism: if, for instance, \verb>^^a> +is typed to produce character~33, then a following +\n0--\n9, \n{a}--\n{f} will be misunderstood. + +While this process makes \TeX's input processor +somewhat more powerful +than a true finite state automaton, +it does not interfere with the rest of +the scanning. Therefore it is conceptually simpler to pretend that +such a replacement of triplets or quadruplets +of characters, starting with~\verb>^^>, is performed in advance. +In actual practice this is not possible, +because an +input line may assign category code~7 to some +character other than the circumflex, thereby +influencing its further processing. + + +%\point Transitions between internal states +\section{Transitions between internal states} + +Let us now discuss the effects on the internal state +of \TeX's input processor when +certain category codes are encountered in the input. + +%\spoint 0: escape character +\subsection{0: escape character} + +When an escape character is encountered\term character !escape\par, +\TeX\ starts forming a control sequence token. +Three different types of control sequence can result, +depending on the category code of the character that +follows the escape character. + +\begin{itemize}\item +If the character following the escape is of category~11, +letter, then \TeX\ combines the escape, +that character and all following +characters of category~11, into a control word. +After that \TeX\ +goes into state~{\italic S}, skipping spaces. +\item +With a character of category~10, space, +a control symbol called control space results, +and \TeX\ goes into state~{\italic S}. +\item +With a character of any other category code +a control symbol results, and \TeX\ goes into state~{\italic M}, +middle of line. +\end{itemize} + +The letters of a control sequence name have to be all on one line; +a control sequence name is not continued on the next line +if the current line ends with a comment sign, or if (by letting +\cs{endlinechar} be outside the range~0--255) +there is no terminating character. + +%\spoint 1--4, 7--8, 11--13: non-blank characters +\subsection{1--4, 7--8, 11--13: non-blank characters} + +Characters of category codes 1--4, 7--8, and 11--13 are made +into tokens, and \TeX\ goes into state~{\italic M}. + +%\spoint 5: end of line +\subsection{5: end of line} + +Upon encountering an end-of-line character, +\TeX\ discards the rest of the +line, and starts processing the next line, +in state~{\italic N}. If the current state was~{\italic N}, +\awp +that is, if the +line so far contained at most spaces, a~\cs{par} token +is inserted; if the state was~{\italic M}, a~space token is inserted, +and in state~{\italic S} nothing is inserted. + +Note that by `end-of-line character' a character with category +code~5 is meant. This is not necessarily the \cs{endlinechar}, +nor need it appear at the end of the line. +See below for further remarks on line ends. + +%\spoint 6: parameter +\subsection{6: parameter} + +Parameter characters \ldash usually~\verb=#= \rdash can be +\term character !parameter\par +followed by either a digit \n{1..9} +in the context of macro definitions +\altt +or by another parameter character. +In the first case a `parameter token' results, +in the second case only a single parameter character +is passed on as a character token for further processing. +In either case \TeX\ goes into state~{\italic M}. + +A parameter character can also appear on its own in an +alignment preamble (see Chapter~\ref{align}). + +%\spoint 7: superscript +\subsection{7: superscript} + +A superscript character is handled like most non-blank +characters, except in the case where it is followed +by a superscript character of the same character code. +The process +that replaces these two characters plus the following character +(possibly two characters in \TeX3) by another character +was described above. + +%\spoint 9: ignored character +\subsection{9: ignored character} + +Characters of category 9 are ignored; \TeX\ remains in the same state. + +%\spoint 10: space +\subsection{10: space} + +A token with category code 10 \ldash this is called a \gr{space token}, +irrespective of the character code \rdash +is ignored in states {\italic N} and~{\italic S} +(and the state does not change); +in state~{\italic M} \TeX\ goes into state~{\italic S}, inserting +a token that has category~10 and character code~32 +(\ascii{} space)\term character !space\par, +that is, the character code of the space token may change +from the character that was actually input. + +%\spoint 14: comment +\subsection{14: comment} + +A comment character causes \TeX\ to discard +the rest of the line, including the comment character. +In particular, the end-of-line character is not seen, +so even if the comment was encountered in state~{\italic M}, no space +token is inserted. + +%\spoint 15: invalid +\subsection{15: invalid} + +Invalid characters cause an error message. \TeX\ remains in +the state it was in. +However, in the context of a control symbol an invalid character +is acceptable. Thus \verb>\^^?> does not cause any error messages. +\awp + +%\point[cat12] Letters and other characters +\section{Letters and other characters} +\label{cat12} + +In most programming languages identifiers can consist +of both letters and digits (and possibly some other +character such as the underscore), but control sequences in \TeX\ +are only allowed to be formed out of characters of category~11, +letter. Ordinarily, the digits and punctuation symbols have +category~12, other character. +However, there are contexts where \TeX\ itself +generates a string of characters, all of which have +category code~12, even if that is not their usual +category code. + +This happens when the operations +\cs{string}, +\cs{number}, +\cs{romannumeral}, +\cs{jobname}, +\cs{fontname}, +\cs{meaning}, +and \cs{the} +are used to generate a stream of character tokens. +If any of the characters delivered by such a command +is a space character (that is, character code~32), +it receives category code~10, space. + +For the extremely rare case where a hexadecimal digit has been +hidden in a control sequence, \TeX\ allows \n A$_{12}$--\n F$_{12}$ +to be hexadecimal digits, in addition to the ordinary +\n A$_{11}$--\n F$_{11}$ (here +the subscripts denote the category codes). + +For example, +\begin{disp}\verb>\string\end>\quad gives four character tokens\quad +\n{\char92$_{12}$e$_{12}$n$_{12}$d$_{12}$} \end{disp} +Note that +\n{\char92$_{12}$}\term character !escape\par\label{use:escape} +is used in the output only because the +value of \cs{escapechar} is the character code for the +backslash. Another value of \cs{escapechar} leads to another +character in the output of \cs{string}. +The \cs{string} command is treated further in Chapter~\ref{char}. + +Spaces can wind up in control sequences: +\begin{disp}\verb>\csname a b\endcsname>\end{disp} gives a control sequence +token in which one of the three characters is a space. +Turning this control sequence token into a string of characters +\begin{disp}\verb>\expandafter\string\csname a b\endcsname>\end{disp} +gives \n{\char92$_{12}$a$_{12}$\char32$_{10}$b$_{12}$}. + + +As a more practical example, suppose there exists a sequence +of input files \n{file1.tex}, \n{file2.tex}\label{ex:jobnumber}, +and we want to +write a macro that finds the number of the input file +that is being processed. One approach would be to write +\begin{verbatim} +\newcount\filenumber \def\getfilenumber file#1.{\filenumber=#1 } +\expandafter\getfilenumber\jobname. +\end{verbatim} +where the letters \n{file} in the parameter text of the +macro (see Section~\ref{param:text}) absorb that part of the +jobname, leaving the number as the sole parameter. + +However, this is slightly incorrect: the letters \n{file} resulting +from the \cs{jobname} command have category code~12, instead of +11 for the ones in the definition of \cs{getfilenumber}. +This can be repaired as follows: +\begin{verbatim} +{\escapechar=-1 + \expandafter\gdef\expandafter\getfilenumber + \string\file#1.{\filenumber=#1 } +} +\end{verbatim} +\awp +Now the sequence \verb>\string\file> gives the four +letters \n{f$_{12}$i$_{12}$l$_{12}$e$_{12}$}; +the \cs{expandafter} commands let this be executed prior to +the macro definition; +the backslash is omitted because we put \verb>\escapechar=-1>. +Confining this value to a group makes it necessary to use~\cs{gdef}. + + +%\global\def\pppar.{\par} +%\point The \lowercase{\n{\char92par}} token +\section{The \lowercase{\n{\char92par}} token} + +\TeX\ inserts a \cstoidx par\par\ token into the input after +\term line !empty\par +encountering a character with category code~5, +end of line, in state~{\italic N}. +It is good to realize when exactly this happens: +since \TeX\ leaves state~{\italic N} +when it encounters any token but a space, +a~line giving a \cs{par} can only contain characters +of category~10. In particular, it cannot end with a comment +character. Quite often this fact is used the other way around: +if an empty line is wanted for the layout of the input +one can put a comment sign on that line. + + +Two consecutive empty lines generate two \cs{par} tokens. +For all practical purposes this is equivalent to one \cs{par}, +because after the first one \TeX\ enters vertical mode, and +in vertical mode a \cs{par} only +exercises the page builder, +and clears the paragraph shape parameters. + +A \cs{par} is also inserted into the input when \TeX\ sees a +\gram{vertical command} in unrestricted horizontal mode. +After the \cs{par} has been read and expanded, the +vertical command is examined anew (see Chapters~\ref{hvmode} +and~\ref{par:end}). + +The \cs{par} token may also be inserted by the \cs{end} +command that finishes off the run of \TeX; see Chapter~\ref{output}. + +It is important to realize that \TeX\ does what it normally does +when encountering an empty line +(which is ending a paragraph) +only because of the default definition of the \cs{par} token. +By redefining \cs{par} the behaviour +caused by empty lines and vertical commands can be changed completely, +and interesting special effects can be achieved. +In order to continue to be able to cause the actions normally +associated with \cs{par}, the synonym \cs{endgraf} is +available in the plain format. See further Chapter~\ref{par:end}. + +The \cs{par} token is not allowed to be part of a macro +argument, unless the macro has been declared to be \cs{long}. +A \cs{par} in the argument of a non-\cs{long} macro +prompts \TeX\ to give a `runaway argument' message. +Control sequences that have been \cs{let} to \cs{par} +(such as \cs{endgraf}) are allowed, however. + +%\point Spaces +\section{Spaces} + +This section treats some of the aspects of +\term token !space\par +space characters and space tokens in the initial processing +stages of \TeX. The topic of spacing in text typesetting +is treated in Chapter~\ref{space}. + + +%\spoint Skipped spaces +\subsection{Skipped spaces} + +From the discussion of the internal states of \TeX's +input processor +it is clear that some spaces in the input never reach the +\awp +output; in fact they never get past the input processor. +These are for instance the spaces at the beginning +of an input line, and the spaces following the one +that lets \TeX\ switch to state~{\italic S}. + + +On the other hand, line ends can generate spaces (which are not +in the input) that may wind up in the output. +There is a third kind of space: the spaces that get past the +input processor, +or are even generated there, but still do not wind up in the +output. These are the \gram{optional spaces} that the +syntax of \TeX\ allows in various places. + +%\spoint Optional spaces +\subsection{Optional spaces} + +The syntax of \TeX\ has the concepts of `optional spaces' +\term space! optional \par +and `one optional space': +\begin{disp}\gr{one optional space} $\longrightarrow$ +\gr{space token} $|$ \gr{empty}\nl +\gr{optional spaces} $\longrightarrow$ +\gr{empty} $|$ \gr{space token}\gr{optional spaces}\end{disp} +In general, \gr{one optional space} is allowed after +numbers and glue specifications, while \gr{optional spaces} are +allowed whenever a space can occur inside a number +(for example, between a minus sign and the digits of the number) +or glue specification (for example, between \n{plus} and \n{1fil}). +Also, the definition of \gr{equals} allows \gr{optional spaces} +before the \n= sign. + +Here are some examples of optional spaces. + +\begin{itemize} +\item A number can be delimited by \gr{one optional space}. +This prevents accidents (see Chapter~\ref{number}), +and it speeds up processing, as \TeX\ can +detect more easily where the \gram{number} being read ends. +Note, however, that not every `number' is a \gram{number}: +for instance the {\tt 2} in \cs{magstep2} is not a number, +but the single token that is the parameter of the +\cs{magstep} macro. Thus a space or line end after this +is significant. Another example is a parameter number, +for example~\n{\#1}: since at most nine parameters are allowed, scanning +one digit after the parameter character suffices. + +\item From the grammar of \TeX\ +it follows that the +keywords \n{fill} and \n{filll} +consist of \n{fil} and +separate {\tt l}$\,$s, each of which is a keyword +(see page~\pageref{keywords} for a more elaborate discussion), +and hence can be followed by optional spaces. +Therefore forms such as \hbox{\n{fil L l}} are also valid. +This is a potential source of strange accidents. +In most cases, appending a \cs{relax} token prevents +such mishaps. + +\item The primitive command \cstoidx ignorespaces\par\ +may come in handy as the final command in a macro definition. +As it gobbles up +optional spaces, it can be used to prevent spaces following the +closing brace of an argument from winding up in the output +inadvertently. For example, in +\begin{verbatim} +\def\item#1{\par\leavevmode + \llap{#1\enspace}\ignorespaces} +\item{a/}one line \item{b/} another line \item{c/} +yet another +\end{verbatim} +the \cs{ignorespaces} prevents spurious +spaces in the second and third item. +An empty line +after \cs{ignorespaces} will still insert a \cs{par}, however. +\end{itemize} +\awp + +%\spoint Ignored and obeyed spaces +\subsection{Ignored and obeyed spaces} + +After control words spaces are ignored. This is not an +instance of optional spaces, but it is due to the fact that +\TeX\ goes into state~{\italic S}, skipping spaces, after control +words. Similarly an end-of-line character is skipped +after a control word. + +Numbers are delimited by only \gr{one optional space}, +but still +\begin{disp}\n{a\char92 count0=3\char32\char32b}\quad gives\quad `ab',\end{disp} +because \TeX\ goes into state~{\italic S} after the first +space token. The second space is therefore skipped +in the input processor of \TeX; it never becomes a space token. + +Spaces are skipped furthermore when \TeX\ is in state~{\italic N}, +newline. When \TeX\ is processing in vertical mode +space tokens (that is, spaces that were not skipped) +are ignored. For example, the space inserted (because of the line end) +after the first box in +\begin{verbatim} +\par +\hbox{a} +\hbox{b} +\end{verbatim} +has no effect. + +Both plain \TeX\ and \LaTeX\ define a command \cs{obeyspaces} +\altt +that makes spaces significant: after one space other spaces are no +longer ignored. In both cases the basis is +\altt +\begin{verbatim} +\catcode`\ =13 \def {\space} +\end{verbatim} +However, there is a difference between the two cases: +in plain \TeX\ \begin{verbatim} +\def\space{ } +\end{verbatim} +while in \LaTeX\ \begin{verbatim} +\def\space{\leavevmode{} } +\end{verbatim} +although the macros bear other names there. + +The difference between the two macros becomes +apparent in the context of \cs{obeylines}: +each line end is then a \cs{par} command, implying that +each next line is started in vertical mode. +An active space is expanded by the plain macro to a space token, +which is ignored in vertical mode. +The active spaces in \LaTeX\ will immediately switch to horizontal +mode, so that each space is significant. + +%\spoint More ignored spaces +\subsection{More ignored spaces} + +There are three further places where \TeX\ will ignore space tokens. +\alt +\begin{enumerate} +\item When \TeX\ is looking for +an undelimited macro argument it will accept the +first token (or group) that is not a space. This is treated +in Chapter~\ref{macro}. + +\item In math mode space tokens are ignored (see Chapter~\ref{math}). + +\item After an alignment tab character spaces are ignored +(see Chapter~\ref{align}). +\end{enumerate} +\awp + +%\spoint \gr{space token} +\subsection{\gr{space token}} + +Spaces are anomalous in \TeX. +For instance, the \cs{string} operation +assigns category code~12 to all +characters except spaces; they receive category~10. +Also, as was said above, \TeX's input processor converts (when in +state~{\italic M}) all tokens with category code~10 into real spaces: +they get character code~32. +Any character token with category~10 is called +\gram{space token}\term space! token\par. +Space tokens with character +code not equal to 32 are called `funny spaces' +\term space !funny\par. + +\begin{example} After giving the character \n Q +the category code of a space character, +and using it in a definition +\begin{verbatim} +\catcode`Q=10 \def\q{aQb} +\end{verbatim} +we get +\begin{verbatim} +\show\q +macro:-> a b +\end{verbatim} +because the input processor +changes the character code of the funny space +in the definition. +\end{example} + +Space tokens with character codes other than 32 can be +created using, for instance, \cs{uppercase}. +However, `since the various forms of +space tokens are almost identical in behaviour, there's no +point dwelling on the details'; see~\cite{Knuth:TeXbook}~p.~377. + + +%\spoint Control space +\subsection{Control space} + +The `control space' command \verb-\-\n{\char32} +\cstoidx\char32\par\ +contributes the amount of space that a \gr{space token} would +when the \verb=\spacefactor= is~1000. +A~control space +is not treated like a space token, or like a macro +expanding to one (which is how \cs{space} is defined in plain \TeX). +For instance, \TeX\ ignores spaces +at the beginning of an input line, but +control space is a \gr{horizontal command}, so it +makes \TeX\ switch from vertical to horizontal mode +(and insert an indentation box). +See Chapter~\ref{space} for the space factor, and +chapter~\ref{hvmode} for horizontal and vertical modes. + +%\spoint `\n{\char32}' +\subsection{`\n{\char32}'} + +The explicit symbol `\n{\char32}' for a space +is character~32 in the Computer Modern typewriter typeface. +However, switching to \cs{tt} is not sufficient to get +spaces denoted this way, because spaces will still +receive special treatment in the input processor. + +One way to +let spaces be typeset by \n{\char32} +is to set \begin{verbatim} +\catcode`\ =12 +\end{verbatim} +\TeX\ will then take a space as the instruction to +typeset character number~32. Moreover, subsequent spaces +are not skipped, but also typeset this way: state~{\italic S} +\awp +is only entered after a character with category code~10. +Similarly, spaces after a control sequence are made +visible by changing the category code of the space character. + +%\point More about line ends +\section{More about line ends} + +\TeX\ accepts lines from an input file, excluding any line +terminator that may be used\term line! end\par. +Because of this, \TeX's behaviour here is not dependent +on the operating system and the line terminator it uses (\key{CR}-\key{LF}, +\key{LF}, or none at all for block storage). +From the input line any trailing spaces are removed. +The reason for this is historic; it has to do with +the block storage mode on \key{IBM} mainframe computers. +For some computer-specific problems with end-of-line +characters, see~\cite{B:ctrl-M}. + +A~terminator character is then appended +with a character code of \cs{endlinechar}, +unless this parameter has a value that +is negative or more than~255. +Note that this terminator character +need not have category code~5, end of line. + +%\spoint Obeylines +\subsection{Obeylines} + +Every once in a while it is desirable that the line ends in +\message{Check spurious space obeylines+1}% +\cstoidx obeylines\par\howto Change the meaning of the line end\par +the input correspond to those in the output. +The following piece of code does the trick: +\begin{verbatim} +\catcode`\^^M=13 % +\def^^M{\par}% +\end{verbatim} +The \cs{endlinechar} character is here made active, +and its meaning becomes \cs{par}. +The comment signs prevent \TeX\ from seeing the terminator of the +\alt +lines of this definition, and expanding it since it is active. + +However, it takes some care to embed this code in a macro. +The definition +\begin{verbatim} +\def\obeylines{\catcode`\^^M=13 \def^^M{\par}} +\end{verbatim} +will be misunderstood: +\TeX\ will discard everything +after the second \verb>^^M>, because this has category code~5. +Effectively, this line is then +\begin{verbatim} +\def\obeylines{\catcode`\^^M=13 \def +\end{verbatim} +To remedy this, +the definition itself has to be +performed in a context where \verb>^^M> is an active +character:\begin{verbatim} +{\catcode`\^^M=13 % + \gdef\obeylines{\catcode`\^^M=13 \def^^M{\par}}% +} +\end{verbatim} +Empty lines in the input are not taken into account +in this definition: these disappear, because two consecutive \cs{par} +tokens are (in this case) equivalent to one. +A slightly modified definition for the line end as +\begin{verbatim} +\def^^M{\par\leavevmode} +\end{verbatim} +remedies this: +now every line end forces \TeX\ to start a paragraph. For empty +lines this will then be an empty paragraph. +\awp + +%\spoint Changing the \cs{\endlinechar} +\subsection{Changing the \cs{endlinechar}} + +Occasionally you may want to change the \cs{endlinechar}, or +the \cs{catcode} of the ordinary line terminator \verb.^^M., +for instance to obtain special effects such as macros where +the argument is terminated by the line end. +See page~\pageref{pick:eol} for a worked-out example. + +There are a couple of traps. Consider the following: +\begin{verbatim} +{\catcode`\^^M=12 \endlinechar=`\^^J \catcode`\^^J=5 +... +... } +\end{verbatim} +This causes unintended output of both character~13 (\verb-^^M-) +and~10 (\verb-^^J-), caused by the line terminators of the +first and last line. + +Terminating the first and last line with a comment works, +but replacing the first line by the two lines +\begin{verbatim} +{\endlinechar=`\^^J \catcode`\^^J=5 +\catcode`\^^M=12 +\end{verbatim} +is also a solution. + +Of course, in many cases it is not necessary to substitute +another end-of-line character; a~much simpler solution +is then to put \begin{verbatim} +\endlinechar=-1 +\end{verbatim} +which treats all lines as if they end with a comment. + +%\spoint More remarks about the end-of-line character +\subsection{More remarks about the end-of-line character} + +The character that \TeX\ appends at the end of an input line +is treated like any other character. Usually one is not aware +of this, as its category code is special, but there are a few +ways to let it be processed in an unusual way. + +\begin{example} Terminating an input line with \verb>^^> will +(ordinarily, when \cs{endlinechar} is~13) give `M' in the output, +which is the +\ascii{} character with code~13+64. +\end{example} + +\begin{example} If \verb>\^^M> has been defined, +terminating an input line with a backslash will execute this command. +The plain format defines +\begin{verbatim} +\def\^^M{\ } +\end{verbatim} +which makes a `control return' equivalent to a control space. +\end{example} + +%\point More about the input processor +\section{More about the input processor} + +%\spoint The input processor as a separate process +\subsection{The input processor as a separate process} + +\TeX's levels of processing are all working at the +\awp +same time and incrementally, but conceptually they can often be +considered to be separate processes that each accept the +completed output of the previous stage. The juggling with +spaces provides a nice illustration for this. + +Consider the definition +\begin{verbatim} +\def\DoAssign{\count42=800} +\end{verbatim} +and the call +\begin{verbatim} +\DoAssign 0 +\end{verbatim} +The input processor, the part +of \TeX\ that builds tokens, in scanning this call +skips the space before the zero, so the expansion of this +call is \begin{verbatim} +\count42=8000 +\end{verbatim} +It would be incorrect to reason +`\cs{DoAssign} is read, then expanded, the space delimits the +number 800, so 800 is assigned and the zero is printed'. +Note that the same would happen if the zero appeared on the next line. + +Another illustration shows that optional spaces appear in a different +stage of processing from that for skipped spaces: +\begin{disp}\verb>\def\c.{\relax}>\nl + \verb>a\c.>{\tt\char32 b}\end{disp} +expands to +\begin{disp}\n{a\cs{relax}\char32 b}\end{disp} +which gives as output\begin{disp} `a b'\end{disp} +because spaces after the \cs{relax} control sequence are only +skipped when the line is first read, not when it is expanded. +The fragment +\begin{disp} \verb-\def\c.{\ignorespaces}-\nl \verb-a\c. b-\end{disp} +on the other hand, expands to +\begin{disp}\n{a\cs{ignorespaces}\char32 b}\end{disp} +Executing the \cs{ignorespaces} command removes the subsequent +space token, so the output is \begin{disp} `ab'.\end{disp} +In both definitions +the period after \cs{c} is a delimiting token; it is used here +to prevent spaces from being skipped. + +%\spoint The input processor not as a separate process +\subsection{The input processor not as a separate process} + +Considering the tokenizing of \TeX\ to be a separate process +is a convenient view, but sometimes it leads to confusion. +The line \begin{verbatim} +\catcode`\^^M=13{} +\end{verbatim} +\awp +makes the line end active, +and subsequently gives an `undefined control sequence' error +for the line end of this line itself. Execution of the commands +on the line thus influences the scanning process of that +same line. + +By contrast, \begin{verbatim} +\catcode`\^^M=13 +\end{verbatim} +does not give an error. +The reason for this is that \TeX\ reads the line end while it is still +scanning the number~13; that is, at a time when the assignment +has not been performed yet. +The line end is then converted to the optional space character +delimiting the number to be assigned. + +%\spoint Recursive invocation of the input processor +\subsection{Recursive invocation of the input processor} + +Above, the activity of replacing a parameter +character plus a digit by a parameter token was described +as something similar to the lumping together of letters +into a control sequence token. Reality is somewhat more +complicated than this. \TeX's token scanning mechanism +is invoked both for input from file and for input from +lists of tokens such as the macro definition. Only in the +first case is the terminology of internal states applicable. + +Macro parameter characters are treated the same in both +cases, however. If this were not the case it would +not be possible to write things such as +\begin{verbatim} +\def\a{\def\b{\def\c####1{####1}}} +\end{verbatim} +See page \pageref{nest:def} for an explanation of such +nested definitions. + +%\point The \verb@- convention +\section{The \n{@} convention} + +Anyone who has ever browsed through either the plain format or +the \LaTeX\ format will have noticed that a lot of control sequences +contain an `at' sign:~\verb-@-. These are control sequences that +are meant to be inaccessible to the ordinary user. + +Near the beginning of the format files the instruction +\begin{verbatim} +\catcode`@=11 +\end{verbatim} +occurs, making the at sign into a letter, +meaning that it can be used in control sequences. Somewhere near the +end of the format definition the at sign is made `other' again: +\begin{verbatim} +\catcode`@=12 +\end{verbatim} + +Now why is it that users cannot +call a control sequence with an at sign +directly, although they can call macros that contain lots of those +`at-definitions'? The reason is that the control sequences +containing an \n@ are internalized by \TeX\ at definition time, +after which they are a token, not a string of characters. +Macro expansion then +just inserts such tokens, and at that time the category codes +of the constituent characters do not matter any more. + +%%%% end of input file [mouth] + +%\InputFile:char +%%%% this is input file [char] +%\subject[char] Characters +\endofchapter +\chapter{Characters}\label{char} + +Internally, \TeX\ represents characters by their (integer) +character code. This chapter treats those codes, and the +commands that have access to them. + +\begin{inventory} +\item [\cs{char}] + Explicit denotation of a character to be typeset. + +\item [\cs{chardef}] + Define a control sequence to be a synonym for + a~character code. + +\item [\cs{accent}] + Command to place accent characters. + +\item [\cs{if}] + Test equality of character codes. + +\item [\cs{ifx}] + Test equality of both character and category codes. + +\item [\cs{let}] + Define a control sequence to be a synonym of a token. + +\item [\cs{uccode}] + Query or set + the character code that is the uppercase variant of a given code. + +\item [\cs{lccode}] + Query or set + the character code that is the lowercase variant of a given code. + +\item [\cs{uppercase}] + Convert the \gr{general text} argument to its uppercase form. + +\item [\cs{lowercase}] + Convert the \gr{general text} argument to its lowercase form. + +\item [\cs{string}] + Convert a token to a string of one or more characters. +\item [\cs{escapechar}] + Number of the character that is to be used + for the escape character + when control sequences are being converted + into character tokens. \IniTeX\ default:~92~(\cs{}). +\end{inventory} + +%\point[char:code] Character codes +\section{Character codes} +\label{char:code} + +Conceptually it is easiest to think that \TeX\ works with +\term character! codes\par +characters internally, but in fact +\TeX\ works with integers: the `character codes'. + +The way characters are encoded in a computer may differ +from system to system. +Therefore \TeX\ uses its own scheme of character codes. +Any character that is read from a file (or from the user terminal) +is converted to a character code according to the +character code table. +A~category code is then assigned based on this (see Chapter~\ref{mouth}). +The character code table is based on the 7-bit \ascii{} table +for numbers under~128 (see Chapter~\ref{table}). + +There is an explicit conversion between characters +(better: character tokens) +and character codes using the left quote (grave, back quote) +character~\n{`{}}: +at all places where \TeX\ expects a \gram{number} you +can use the left quote followed by a character +token or +a single-character control sequence. +Thus both \verb.\count`a. and \verb.\count`\a. are synonyms +\awp +for \verb.\count97.. See also Chapter~\ref{number}. + +The possibility of a single-character control +sequence is necessary in certain cases such as +\begin{disp}\verb>\catcode`\%=11>\quad or\quad \verb>\def\CommentSign{\char`\%}>\end{disp} +which would be misunderstood if the backslash were left out. +For instance \begin{verbatim} +\catcode`%=11 +\end{verbatim} +would consider +the \n{=11} to be a comment. +Single-character +control sequences can be formed from characters with any +category code. + +After the conversion to character codes any connection +with external representations has disappeared. Of course, +for most characters the visible output will `equal' the input +(that is, an `\n{a}' causes an~`a'). +There are exceptions, however, even among the common symbols. +In the Computer Modern +roman fonts there are no `less than' and `greater than' +\message{Check <>! Dammit!}% +signs, so the input `\verb.<>.' will give `<>' in the output. +%{\MathRMx<>} + +In order to make \TeX\ machine independent at the output +side, the character codes are also used in the \n{dvi} file: +opcodes $n=0\ldots127$ denote simply the instruction `take +character $n$ from the current font'. The complete definition +of the opcodes in a \n{dvi} file can be found in~\cite{Knuth:TeXprogram}. + + +%\point Control sequences for characters +\section{Control sequences for characters} + +There are a number of ways in which a control sequence can denote +a character. The \cs{char} command specifies a character to be +typeset; the \cs{let} command introduces +a synonym for a character token, that is, +the combination of character code and category code. + +%\point Denoting characters to be typeset: \cs\char +\section{Denoting characters to be typeset: \protect\cs{char}} + +Characters can be denoted numerically by, for example, +\verb.\char98.\cstoidx char\par. +This command tells \TeX\ to add character number~98 of the +current font to the horizontal list currently under construction. + +Instead of decimal notation, it is often more convenient to +use octal or hexadecimal notation. For octal the single quote is used: +\verb.\char'142.; hexadecimal uses the double quote: \verb.\char"62.. +Note that \verb.\char''62. is incorrect; the process that replaces +two quotes by a double quote works at a later stage of processing +(the visual processor) than number scanning (the execution processor). + +Because of the explicit conversion to character codes by the +back quote character it is also possible to get a `b' \ldash provided +that you are using a font organized a bit like the \ascii{} table \rdash +with \verb.\char`b. or \verb.\char`\b.. + +The \cs{char} command looks superficially a bit like +the \verb-^^- substitution mechanism (Chapter~\ref{mouth}). +Both mechanisms access characters without directly denoting them. +However, the \verb-^^- mechanism operates in a very early stage of +processing (in the input processor of \TeX, +but before category code +assignment); the \cs{char} command, on the other hand, +comes in the final stages of processing. +In effect it says `typeset character number +so-and-so'. +\awp + +There is a construction to let a control sequence stand +for some character code: the \cstoidx chardef\par\ command. +The syntax of this is \label{chardef} +\begin{disp}\cs{chardef}\gram{control sequence}\gr{equals}\gram{number}, +\end{disp} +where the number can be an explicit +representation or a counter value, but it can also be +a character code +obtained using the left quote command (see above; +the full definition of \gr{number} is given in Chapter~\ref{number}). +In the plain format +the latter possibility is used in +definitions such as \begin{verbatim} +\chardef\%=`\% +\end{verbatim} +which could have been given equivalently as +\begin{verbatim} +\chardef\%=37 +\end{verbatim} +After this command, the control symbol \verb>\%> +used on its own is a synonym for \verb>\char37>, +that is, the command to typeset character~37 +(usually the per cent character). + +A control sequence that has been defined with a \cs{chardef} +command can also be used as a \gr{number}. +This fact is used in allocation commands such as +\cs{newbox} (see Chapters~\ref{number} and~\ref{alloc}). +Tokens defined with \cs{mathchardef} can also be used this +way. + +%\spoint Implicit character tokens: \cs{let} +\subsection{Implicit character tokens: \protect\cs{let}} + +Another construction defining a control sequence +\term character !implicit\par +to stand for (among other things) +a character is~\cs{let}\cstoidx let\par: +\begin{disp}\cs{let}\gr{control sequence}\gr{equals}\gr{token}\end{disp} +with a character token on the right hand side of the (optional) +equals sign. The result is called an implicit character token. +(See page~\pageref{let} for a further discussion of~\cs{let}.) + +In the +plain format there are for instance synonyms for +the open and close brace: +\begin{verbatim} +\let\bgroup={ \let\egroup=} +\end{verbatim} +The resulting control sequences are called `implicit braces' +(see Chapter~\ref{group}). + +Assigning characters by \cs{let} +is different from defining control sequences by \cs{chardef}, +in the sense that \cs{let} +makes the control sequence stand for the combination +of a character code and category code. + +As an example +\begin{verbatim} +\catcode`|=2 % make the bar an end of group +\let\b=| % make \b a bar character +{\def\m{...}\b \m +\end{verbatim} +gives an `undefined control sequence \cs{m}' +because the \cs{b} closed the group inside which \cs{m} +was defined. On the other hand, +\begin{verbatim} +\let\b=| % make \b a bar character +\catcode`|=2 % make the bar character end of group +{\def\m{...}\b \m +\end{verbatim} +leaves one group open, and it prints a vertical bar +(or whatever is in position 124 of the current font). +The first of these examples +implies that even when the braces have been redefined +(for instance into active characters for macros that +format C code) the beginning-of-group and end-of-group +functionality is available through the control sequences +\cs{bgroup} and~\cs{egroup}. + +Here is +another example to show +that implicit character tokens are hard to distinguish +from real character tokens. After the above sequence +\begin{verbatim} +\catcode`|=2 \let\b=| +\end{verbatim} +the tests \begin{verbatim} +\if\b| +\end{verbatim} +and \begin{verbatim} +\ifcat\b} +\end{verbatim} +are both true. + +Yet another example can be found in the plain format: +the commands +\begin{verbatim} +\let\sp=^ \let\sb=_ +\end{verbatim} +allow people without an +underscore or circumflex on their keyboard to +make sub- and superscripts in mathematics. +For instance: +\begin{disp}\verb>x\sp2\sb{ij}>\quad gives\quad $x\sp2\sb{ij}$\end{disp} +If a person typing in the format itself does not have +these keys, some further tricks are needed:\label{spsb:truc} +\begin{verbatim} +{\lccode`,=94 \lccode`.=95 \catcode`,=7 \catcode`.=8 +\lowercase{\global\let\sp=, \global\let\sb=.}} +\end{verbatim} +will do the job; see below for an explanation of lowercase codes. +The \verb>^^> method as it was in \TeX\ version~2 +(see page~\pageref{hathat}) cannot be used here, +as it would require typing two characters that can ordinarily +not be input. +With the extension in \TeX\ version~3 it would also be possible +to write \begin{verbatim} +{\catcode`\,=7 +\global\let\sp=,,5e \global\let\sb=,,5f} +\end{verbatim} +denoting the codes 94 and 95 hexadecimally. + +Finding out just what a control sequence has been defined to be with +\cs{let} can be done using \cs{meaning}: +the sequence \begin{verbatim} +\let\x=3 \meaning\x +\end{verbatim} +gives +`\n{the character 3}'.\awp + +%\point Accents +\section{Accents} + +Accents can be placed by the +\gr{horizontal command}~\cstoidx accent\par\term accents\par +\label{character}: +\begin{disp}\cs{accent}\gr{8-bit number}\gr{optional assignments}% + \gr{character}\end{disp} +where \gr{character} is a character of category 11 or~12, + a~\cs{char}\gr{8-bit number} command, +or a~\cs{chardef} token. If none of these +four types of \gr{character} follows, the accent is taken to be a +\cs{char} command itself; this gives an accent `suspended +in mid-air'. Otherwise the accent is placed +on top of the following character. +Font changes between the accent and the character can be effected +by the \gr{optional assignments}. + +An unpleasant implication of the fact that an \cs{accent} command +has to be followed by a \gr{character} is that it is not +possible to place an accent on a ligature, or +two accents on top of each other. +In some languages, such as Hindi or Vietnamese, +such double accents do occur. +Positioning accents on top of each other is possible, +however, in math mode. + +The width of a character with an accent is the same as that of +the unaccented character. \TeX\ assumes that the +accent as it appears in the font file +is properly positioned for a character that is as high +as the x-height of the font; for characters with other heights +it correspondingly lowers or raises the accent. + +No genuine under-accents exist in \TeX. They are +implemented as low placed over-accents. A~way of handling +them more correctly would be to write a macro that +measures the following character, and raises or drops +the accent accordingly. +The cedilla macro, \cs{c}\cstoidx c\par, +in plain \TeX\ does something along these lines. However, +it does not drop the accent for characters with descenders. + +The horizontal positioning of an accent is controlled by +\cs{fontdimen1}, slant per point. Kerns are used +for the horizontal movement. Note that, although they +are inserted automatically, these kerns are classified +as {\italic explicit\/} kerns. Therefore they inhibit hyphenation +in the parts of the word before and after the kern. + +As an example of kerning for accents, +here follows the dump of a horizontal list. +\message{maybe italic correction for extra line} +\begin{verbatim} +\setbox0=\hbox{\it \`l} +\showbox0 +\end{verbatim} +gives\begin{verbatim} +\hbox(9.58334+0.0)x2.55554 +.\kern -0.61803 (for accent) +.\hbox(6.94444+0.0)x5.11108, shifted -2.6389 +..\tenit ^^R +.\kern -4.49306 (for accent) +.\tenit l +\end{verbatim} +Note that the accent is placed first, so afterwards the italic +correction of the last character is still available. +\awp + +%\point Testing characters +\section{Testing characters} + +Equality of character codes is tested by \cs{if}: +\begin{disp}\cs{if}\gr{token$_1$}\gr{token$_2$}\end{disp} +Tokens following this conditional are expanded until two +unexpandable tokens are left. The condition is then true +if those tokens are character tokens with the same character +code, regardless of category code. + +An unexpandable control +sequence is considered to have character code 256 and +category code~16 (so that it is unequal to anything except +another control sequence), except in the case +where it had been \cs{let} to a non-active character token. +In that case it is considered to have the character code +and category code of that character. This was mentioned above. + +The test \cs{ifcat} for category codes was mentioned +in Chapter~\ref{mouth}; the test +\begin{disp}\cs{ifx}\gr{token$_1$}\gr{token$_2$}\end{disp} +can be used to test for category code and character code +simultaneously. +The tokens following this test are not expanded. +However, if they are macros, \TeX\ +tests their expansions for equality. + +Quantities defined by \cs{chardef} can be tested with +\cs{ifnum}: +\begin{verbatim} +\chardef\a=`x \chardef\b=`y \ifnum\a=\b % is false +\end{verbatim} +based on the fact (see Chapter~\ref{number}) that +\gr{chardef token}s can be used as numbers. + +%\point Uppercase and lowercase +\section{Uppercase and lowercase} + +%\spoint[uc/lc] Uppercase and lowercase codes +\subsection{Uppercase and lowercase codes} +\label{uc/lc} + +To each of the character codes correspond +\term uppercase\par\term lowercase\par +\cstoidx lccode\par\cstoidx uccode\par +an uppercase code and a lowercase code (for still more codes see below). +These can be assigned +by +\begin{Disp}\cs{uccode}\gram{number}\gr{equals}\gram{number}\end{Disp} +and +\begin{Disp}\cs{lccode}\gram{number}\gr{equals}\gram{number}.\end{Disp} +In \IniTeX\ codes \verb-`a..`z-, \verb-`A..`Z- have uppercase code +\label{ini:uclc} +\verb-`A..`Z- and lowercase code \verb-`a..`z-. +All other character codes have both uppercase and lowercase +code zero. + +%\spoint[upcase] Uppercase and lowercase commands +\subsection{Uppercase and lowercase commands} +\label{upcase} + +The commands \verb-\uppercase{...}- and \verb-\lowercase{...}- +\cstoidx uppercase\par\cstoidx lowercase\par +go through their argument lists, replacing all character +codes of explicit character tokens +by their uppercase and lowercase code respectively +if these are non-zero, +without changing the category codes. +\awp + +The argument of \cs{uppercase} and \cs{lowercase} +is a \gr{general text}, which is defined as +\begin{Disp} \gr{general text} $\longrightarrow$ \gr{filler}\lb + \gr{balanced text}\gr{right brace}\end{Disp} +(for the definition of \gr{filler} see Chapter~\ref{gramm}) +meaning that the left brace can be implicit, but the closing +right brace must be an explicit character token with category +code~2. \TeX\ performs expansion to find the opening +brace. + +Uppercasing and lowercasing are executed in the execution processor; +they are not `macro expansion' activities +like \cs{number} or \cs{string}. +The sequence (attempting to produce~\cs{A}) +\begin{verbatim} +\expandafter\csname\uppercase{a}\endcsname +\end{verbatim} +gives an error (\TeX\ inserts an \cs{endcsname} before the +\cs{uppercase} because \cs{uppercase} is unexpandable), but +\begin{verbatim} +\uppercase{\csname a\endcsname} +\end{verbatim} +works. + +As an example of the correct use of \cs{uppercase}, here +is a macro that tests if a character is uppercase: +\begin{verbatim} +\def\ifIsUppercase#1{\uppercase{\if#1}#1} +\end{verbatim} +The same test can be +performed by \verb>\ifnum`#1=\uccode`#1>. + +Hyphenation of words starting with an uppercase character, +that is, a character not equal to its own \cs{lccode}, +is subject to the \cs{uchyph} parameter: if this +is positive, hyphenation of capitalized words is allowed. +See also Chapter~\ref{line:break}. + +%\spoint Uppercase and lowercase forms of keywords +\subsection{Uppercase and lowercase forms of keywords} + +Each character in \TeX\ keywords, such as \n{pt}, can be +given in uppercase or lowercase form. +For instance, \n{pT}, \n{Pt}, \n{pt}, and~\n{PT} all have +the same meaning. \TeX\ does not use +the \cs{uccode} and \cs{lccode} tables here to +determine the lowercase form. Instead it +converts uppercase characters to lowercase by adding~32 +\ldash the \ascii{} difference between uppercase and lowercase +characters \rdash to their character code. This has some implications +for implementations of \TeX\ for non-roman alphabets; +see page 370 of \TeXbook, \cite{Knuth:TeXbook}. + +%\spoint Creative use of \cs{uppercase} and \cs{lowercase} +\subsection{Creative use of \cs{uppercase} and \cs{lowercase}} + +The fact that \cs{uppercase} and \cs{lowercase} do not change +category codes can sometimes be used to create certain +character-code--category-code combinations that would +otherwise be difficult to produce. See for instance the +explanation of the \cs{newif} macro in Chapter~\ref{if}, +and another example on page~\pageref{spsb:truc}. + +For a slightly different application, consider the +problem (solved by Rainer Sch\"opf) of, +given a counter \verb-\newcount\mycount-, writing character +number \verb-\mycount- to the terminal. +Here is a solution: +%\begin{verbatim} +%\lccode`a=\mycount \chardef\terminal=16 +%\lowercase{\write\terminal{a}} +%\end{verbatim} +\begin{verbatim} +\lccode`a=\mycount \chardef\terminal=16 +\end{verbatim} +\awp +\begin{verbatim} +\lowercase{\write\terminal{a}} +\end{verbatim} +The \cs{lowercase} command effectively changes the +argument of the \cs{write} command from~`\n a' +into whatever it should be. + +%\point[codename] Codes of a character +\section{Codes of a character} +\label{codename} + +Each character code has a number of \gr{codename}s associated +\term codenames\par +with it. These are integers in various ranges that determine +how the character is treated in various contexts, or +how the occurrence of that character changes the workings +of \TeX\ in certain contexts. + +The code names are as follows: +\begin{description}\item [\cs{catcode}] +\gr{4-bit number} (0--15); the category to which a character belongs. +This is treated in Chapter~\ref{mouth}. +\item [\cs{mathcode}] +\gr{15-bit number} (0--\verb-"7FFF-) or \verb-"8000-; +determines how a character is treated +in math mode. See Chapter~\ref{mathchar}. +\item [\cs{delcode}] +\gr{27-bit number} (0--\n{\hex7$\,$FFF$\,$FFF}); +determines how a character is treated after +\cs{left} or \cs{right} in math mode. +See page~\pageref{delcodes}. +\item [\cs{sfcode}] +integer; determines how spacing is affected after this character. +See Chapter~\ref{space}. +\item [\cs{lccode}, \cs{uccode}] +\gr{8-bit number} (0-255); lowercase and +uppercase codes \rdash these were treated above. +\end{description} + +%\point Converting tokens into character strings +\section{Converting tokens into character strings} + +The command \cs{string} takes the next token and expands it +\cstoidx string\par +into a string of separate characters. Thus +\begin{verbatim} +\tt\string\control +\end{verbatim} +will give \cs{control} in the +output, and +\begin{verbatim} +\tt\string$ +\end{verbatim} +will give~\verb-$-, but, noting that the string +operation comes after the tokenizing, +\begin{verbatim} +\tt\string% +\end{verbatim} +will {\em not\/} give~\verb$%$, +because the comment +sign is removed by \TeX's input processor. +Therefore, this command will `string' the first token on the next line. + +The \cs{string} command is executed by the expansion processor, thus +it is expanded unless explicitly inhibited (see Chapter~\ref{expand}). + +%\spoint Output of control sequences +\subsection{Output of control sequences} + +In the above examples the typewriter font was selected, because +\cstoidx escapechar\par +the Computer Modern roman font does not have a backslash character. +\awp +However, +\TeX\ need not have used the backslash character to display +a control sequence: it uses character number \cs{escapechar}. +This same value is also used when a control sequence is +output with \cs{write}, \cs{message}, or \cs{errmessage}, +and it is used in the output of \cs{show}, \cs{showthe} and \cs{meaning}. +If \cs{escapechar} is negative or more than~255, +the escape character is not +output; the default value (set in \IniTeX) is~92, the number +of the backslash character. + +For use in a \cs{write} statement the \cs{string} can +in some circumstances be +replaced by \cs{noexpand} (see page~\pageref{expand:write}). + +%\spoint Category codes of a \cs{string} +\subsection{Category codes of a \cs{string}} + +The characters that are the result of a \cs{string} command have +category code~12, except for any spaces in +a stringed control sequence; +they have category code~10. Since inside a control +sequence there are no category codes, +any spaces resulting from \cs{string} are +of necessity only space {\em characters}, that is, +characters with code~32. +However, \TeX's input processor converts +all space tokens that have a character code other than~32 +into character tokens with character code~32, +so the chances are pretty slim that +`funny spaces' wind up in control sequences. + +Other commands with the same behaviour with respect to +category codes as \cs{string}, are +\cs{number}, +\cs{romannumeral}, \cs{jobname}, \cs{fontname}, \cs{meaning}, +and \cs{the}. + + + + +%%%% end of input file [char] + +%\InputFile:fontfam +%%%% this is input file [fontfam] +%\subject[font] Fonts +\endofchapter +\chapter{Fonts}\label{font} + +In text mode \TeX\ takes characters from a `current font'. +\term fonts\par +This chapter describes how fonts are identified to \TeX, +and what attributes a font can have. + +\begin{inventory} +\item [\cs{font}] + Declare the identifying control sequence of a font. + +\item [\cs{fontname}] + The external name of a font. + +\item [\cs{nullfont}] + Name of an empty font that \TeX\ uses in emergencies. + + +\item [\cs{hyphenchar}] + Number of the hyphen character of a font. + +\item [\cs{defaulthyphenchar}] + Value of \cs{hyphenchar} when a font is loaded. + Plain \TeX\ default:~\verb>`\->. + +\item [\cs{fontdimen}] + Access various parameters of fonts. + +\item [\cs{char47}] + Italic correction. + +\item [\cs{noboundary}] + Omit implicit boundary character. +\end{inventory} + +%\point Fonts +\section{Fonts} + +In \TeX\ terminology a font is the set of characters that +is contained in one external font file. +During processing, \TeX\ decides from +what font a character should be taken. This decision is +taken separately for text mode and math mode. + +When \TeX\ is processing ordinary text, characters are taken +from the `current font'. +External font file names are coupled to control sequences +by statements such as +\begin{verbatim} +\font\MyFont=myfont10 +\end{verbatim} +which makes \TeX\ load the file \n{myfont10.tfm}. +Switching the current font to the font described in that file +is then done by +\begin{verbatim} +\MyFont +\end{verbatim} +The status of the current font +can be queried: the sequence \begin{verbatim} +\the\font +\end{verbatim} +produces the control sequence for the current font. + +Math mode completely ignores the current font. Instead +it looks at the `current family', which can contain +three fonts: one for text style, one for script style, +and one for scriptscript style. This is treated +in Chapter~\ref{mathchar}. +\awp + +See \cite{S} for a consistent terminology of fonts and typefaces. + +With `virtual fonts' (see~\cite{K:virt}) it is possible that +what looks like one font to \TeX\ resides in more than +one physical font file. +\alt +See further page~\pageref{virtual:fonts}. + +%\point Font declaration +\section{Font declaration} + +Somewhere during a run of \TeX\ or \IniTeX\ +\cstoidx font\par +the coupling between an internal identifying control sequence +and the external file name of a font has to be made. +The syntax of the command for this is +\begin{disp}\cs{font}\gr{control sequence}\gr{equals}% +\gr{file name}\gr{at clause}\end{disp} +where +\begin{disp}\gr{at clause} $\longrightarrow$ \n{at} \gr{dimen} +$|$ \n{scaled} \gr{number} $|$ \gr{optional spaces}\end{disp} +Font declarations are local to a group. + +By the \gr{at clause} the user specifies that some +magnified version of the font is wanted. The \gr{at clause} comes +in two forms: if the font is given \n{scaled}~{\italic f\/} \TeX\ +multiplies all its font dimensions for that font by~$f/1000$; +if the font +has a design size~{\italic d\/}\n{pt} and +the \gr{at clause} is \n{at}~{\italic p\/}\n{pt} +\TeX\ multiplies all font data by~$p/d$. +The presence of an \gr{at clause} makes no difference for +the external font file (the \n{.tfm} file) +that \TeX\ reads for the font; it just multiplies +the font dimensions by a constant. + + +After such a font declaration, using the defined control sequence +will set the current font to the font of the +control sequence. + +%\spoint Fonts and \n{tfm} files +\subsection{Fonts and \n{tfm} files} + +The external file needed for the font is a \n{tfm} +(\TeX\ font metrics) file, +which is taken independent of any \gr{at clause} +in the \cs{font} declaration. If the \n{tfm} +file has been loaded already (for instance by \IniTeX\ +when it constructed the format), +an assignment of that font file can be reexecuted +without needing recourse to the \n{tfm} file. + +Font design sizes are given in the font metrics files. +The \n{cmr10} font, for instance, has a design size +of 10~point. However, there is not much in the font +that actually has a size of 10~points: the opening and closing +parentheses are two examples, but capital +letters are considerably smaller. + +%\spoint Querying the current font and font names +\subsection{Querying the current font and font names} + +It was already mentioned above that the control sequence +which set the current font can be retrieved by the +command \verb>\the\font>. This is a special case of +\begin{Disp}\cs{the}\gr{font}\end{Disp} where +\begin{disp}\gr{font} $\longrightarrow$ +\cs{font} $|$ \gr{fontdef token} $|$ \gr{family member}\nl +\gr{family member} $\longrightarrow$ +\gr{font range}\gr{4-bit number}\nl +\gr{font range} $\longrightarrow$ +\cs{textfont} $|$ \cs{scriptfont} $|$ \cs{scriptscriptfont}\end{disp} +\awp +A \gr{fontdef token} is a control sequence defined by \cs{font}, +or the predefined control sequence \cs{nullfont}. +The concept of \gr{family member} is only +relevant in math mode. + +Also, the +\cstoidx fontname\par +external name of fonts can be retrieved: +\begin{Disp}\cs{fontname}\gr{font}\end{Disp} +gives a sequence of character tokens of category~12 +(but space characters get category~10) that spells the font file +name, plus an \gr{at clause} if applicable. + +\begin{example} After +\begin{verbatim} +\font\tenroman=cmr10 \tenroman +\end{verbatim} +the calls +\verb>\the\font> and \verb>\the\tenroman> both give \cs{tenroman}. +The call \verb>\fontname\tenroman> gives \n{cmr10}. +\end{example} + +%\spoint \cs{nullfont} +\subsection{\cs{nullfont}} + +\TeX\ always knows a font that has no characters: the \csidx{nullfont}. +If no font has been specified, or if in math mode a family member +is needed that has not been specified, +\TeX\ will take its characters from the nullfont. +This control sequence qualifies as a \gr{fontdef token}: +it acts like any other control sequence that stands for a font; +it just does not have an associated \n{tfm} file. + +%\point Font information +\section{Font information} + +During a run of \TeX\ the main information needed about the +\term \n{tfm} files\par +font consists of the dimensions of the characters. +\TeX\ finds these in the font metrics files, which usually have +extension \n{.tfm}. Such files +contain \begin{itemize} \item global information: the \cs{fontdimen} +parameters, and some other information, +\item dimensions and the italic corrections of characters, and +\altt +\item ligature and kerning programs for characters. + \end{itemize} +Also, the design size of a font is specified in the \n{tfm} file; +see above. The definition of the \n{tfm} format can be found +in~\cite{Knuth:TeXprogram}. + +%\spoint[font:dims] Font dimensions +\subsection{Font dimensions} +\label{font:dims} + +Text fonts need to have at least seven \csidx{fontdimen} parameters +(but \TeX\ will take zero for unspecified parameters); +\term font! dimensions\par +math symbol and math extension fonts have more +(see page~\pageref{fam23:fontdims}). +For text fonts the minimal set of seven comprises the following: +\begin{enumerate} \item the slant per point; this dimension is used + for the proper horizontal positioning of accents; +\awp +\item the interword space: this is used unless the user + specifies an explicit \cs{spaceskip}; + see Chapter~\ref{space}; +\item interword stretch: the stretch component of the interword + space; +\item interword shrink: the shrink component of + the interword space; +\item the x-height: the value of + the \gr{internal unit} \n{ex}, which is usually about the + height of the lowercase letter~`x'; +\item the quad width: + the value of the \gr{internal unit} \n{em}, which is + approximately the width of the capital letter~`M'; and +\item the extra space: the space added to the interword space +at the end of sentences (that is, when \cs{spacefactor}${}\geq2000$) +unless the user specifies an explicit \cs{x\-space\-skip}. +\end{enumerate} + +Parameters 1 and~5 are purely information about the font +and there is no point in varying them. +The values of other parameters can be changed in order to +adjust spacing; see Chapter~\ref{space} for examples +of changing parameters 2, 3, 4, and~7. + +Font dimensions can be altered in a \gr{font assignment}, +which is a \gr{global assignment} (see page~\pageref{global:assign}): +\begin{Disp}\cs{fontdimen}\gr{number}\gr{font}\gr{equals}\gr{dimen} +\end{Disp} See above for the definition of \gr{font}. + +%\spoint Kerning +\subsection{Kerning} + +Some combinations of characters should be moved closer +\term kerning\par +together than would be the case if their bounding boxes +were to be just abutted. This fine spacing is called kerning, +and a proper kerning is as essential to a font as the +design of the letter shapes. + +Consider as an example\message{Kerning!} +\begin{Disp} `Vo' versus the unkerned variant `V\hbox{}o'\end{Disp} + +Kerning in \TeX\ is controlled by information in the +\n{tfm} file, and is therefore outside the influence of the +user. The \n{tfm} file can be edited, however (see Chapter~\ref{TeXcomm}). + +The \cs{kern} command has (almost) nothing to do with the +phenomenon of kerning; it is explained in Chapter~\ref{glue}. + +%\spoint Italic correction +\subsection{Italic correction} + +The primitive control symbol \verb-\/- inserts the `italic +\term italic correction\par\cstoidx /\par +correction' of the previous character or ligature. +Such a correction may be necessary owing to the definition +of the `bounding box' of a character. This box always +has vertical sides, and the width of the character as \TeX\ +perceives it is the distance between these sides. +However, in order to achieve proper spacing for slanted or +italic typefaces, characters may very well project outside their +bounding boxes. The italic correction is then needed if +such an overhanging character is followed by a +character from a non-slanting typeface. +\awp + +Compare for instance\message{Visible italic correction!} +\begin{Disp} `{\italic\TeX} has' +to `{\italic\TeX\/} has', +\end{Disp} where the second version was typed as +\begin{verbatim} +{\italic\TeX\/} has +\end{verbatim} + +The size of the italic correction of each character +is determined by font information +in the font metrics file; for the Computer Modern fonts it is +approximately half the `overhang' of the characters; +see~\cite{K:partE}. +Italic correction is not the same as \cs{fontdimen1}, slant +per point. That font dimension is used only for positioning +accents on top of characters. + +An italic correction can only be inserted if the previous item +processed +by \TeX\ was a character or ligature. Thus the +following solution for roman text inside an italic passage +does not work: +\begin{verbatim} +{\italic Some text {\/\roman not} emphasized} +\end{verbatim} +The italic correction has no effect here, +because the previous item is glue. + +%\spoint Ligatures +\subsection{Ligatures} + +Replacement of character sequences by ligatures is controlled +\term ligatures\par +by information in the \n{tfm} file of a font. +Ligatures are formed from \gr{character} commands: +sequences such as \n{fi} are replaced by `fi' in some fonts. + +Other ligatures traditionally in use are +between \n{ff}, \n{ffi}, \n{fl}, and \n{ffl}; +in some older works \n{ft} and \n{st} can be found, +and similarly to the \n{fl} ligature \n{fk} and \n{fb} +can also occur. + +Ligatures in \TeX\ can be formed between explicit character +tokens, \cs{char} commands, and \gr{chardef token}s. +For example, +the sequence \verb-\char`f\char`i- is replaced by the +`fi' ligature, if such a ligature is part of the font. + +Unwanted ligatures can be suppressed in a number of ways: +the unwanted ligature `\hbox{halflife}' can +for instance be prevented by +\begin{disp} \verb>half{}life>, \verb>half{l}ife>, \verb>half\/life>, + or \verb>half\hbox{}life>\end{disp} +but the solution using italic correction is not equivalent +to the others. + +%\spoint Boundary ligatures +\subsection{Boundary ligatures} + +Each word is surrounded by a left and a right +boundary character (\TeX3 only). +This makes phenomena possible +such as the two different sigmas in Greek: +one at the end of a word, and one for every other position. +This can be realized through a ligature with the +boundary character. A~\csidx{noboundary} command immediately +before or after a word suppresses the boundary character +at that place. + +In general, the ligature mechanism has become more complicated +with the transition to \TeX\ version~3; see~\cite{K:TeX23}. + +%%%% end of input file [fontfam] + +%\InputFile:boxes +%%%% this is input file [boxes] +%\tracingmacros=2 \tracingcommands\tracingmacros +%\subject[boxes] Boxes +\endofchapter +\chapter{Boxes}\label{boxes} + +The horizontal and vertical boxes of \TeX\ are containers for +\term box\par +pieces of horizontal and vertical lists. +Boxes can be stored in box registers. +This chapter treats box registers and such +aspects of boxes as their dimensions, and the way their components +are placed relative to each other. + +\begin{inventory} +\item [\cs{hbox}] + Construct a horizontal box. +\item [\cs{vbox}] + Construct a vertical box with reference point of the last item. +\item [\cs{vtop}] + Construct a vertical box with reference point of the first item. +\item [\cs{vcenter}] + Construct a vertical box vertically centred + on the math axis; this command can only be used in math mode. + +\item [\cs{vsplit}] + Split off the top part of a vertical box. + +\item [\cs{box}] + Use a box register, emptying it. + +\item [\cs{setbox}] + Assign a box to a box register. + +\item [\cs{copy}] + Use a box register, but retain the contents. + +\item [\cs{ifhbox \cs{ifvbox}}] +\mdqon + Test whether a box register contains a horizontal/""vertical box. +\mdqoff + +\item [\cs{ifvoid}] + Test whether a box register is empty. + + +\item [\cs{newbox}] + Allocate a new box register. + +\item [\cs{unhbox \cs{unvbox}}] + Unpack a box register containing a horizontal/vertical box, + adding the contents to the current horizontal/vertical list, + and emptying the register. + +\item [\cs{unhcopy \cs{unvcopy}}] + The same as \cs{unhbox}$\,$/$\,$\cs{unvbox}, + but do not empty the register. + +\item [\cs{ht \cs{dp} \cs{wd}}] + Height/depth/width of the box in a box register. + +\item [\cs{boxmaxdepth}] + Maximum allowed depth of boxes. + Plain \TeX\ default:~\cs{maxdimen}. + +\item [\cs{splitmaxdepth}] + Maximum allowed depth of boxes generated by \cs{vsplit}. + +\item [\cs{badness}] + Badness of the most recently constructed box. + +\item [\cs{hfuzz \cs{vfuzz}}] + Excess size that \TeX\ tolerates before it considers +\mdqon + a horizontal/""vertical box overfull. +\mdqoff + +\item [\cs{hbadness \cs{vbadness}}] + Amount of tolerance before \TeX\ reports an underfull +\mdqon + or overfull horizontal/""vertical box. +\mdqoff + +\item [\cs{overfullrule}] + Width of the rule that is printed to indicate + overfull horizontal boxes. + + +\item [\cs{hsize}] + Line width used for text typesetting inside a vertical box. +\awp + +\item [\cs{vsize}] + Height of the page box. + + +\item [\cs{lastbox}] + Register containing the last item added to the current list, + if this was a box. + +\item [\cs{raise \cs{lower}}] + Adjust vertical positioning of a box in horizontal mode. + +\item [\cs{moveleft \cs{moveright}}] + Adjust horizontal positioning of a box in vertical mode. + +\item [\cs{everyhbox \cs{everyvbox}}] +\mdqon + Token list inserted at the start of a horizontal/""vertical box. +\mdqoff + +\end{inventory} + +%\point Boxes +\section{Boxes} + +In this chapter we shall look at boxes. Boxes are containers +for pieces of horizontal or vertical lists. +Boxes that are needed more than once can be stored in box registers. + +When \TeX\ expects a \gr{box}, any of the following forms +is admissible: +\begin{itemize} +\item \cs{hbox}\gr{box specification}\lb\gr{horizontal material}\rb +\item \cs{vbox}\gr{box specification}\lb\gr{vertical material}\rb +\item \cs{vtop}\gr{box specification}\lb\gr{vertical material}\rb +\item \cs{box}\gr{8-bit number} +\item \cs{copy}\gr{8-bit number} +\item \cs{vsplit}\gr{8-bit number}\n{to}\gr{dimen} +\item \cs{lastbox} +\end{itemize} +A \gr{box specification} is defined as\label{box:spec} +\begin{disp}\gr{box specification} $\longrightarrow$ \gr{filler} +\nl\indent$|$ \n{to} \gr{dimen}\gr{filler} + $|$ \n{spread} \gr{dimen}\gr{filler} +\end{disp} +An \gr{8-bit number} is a number in the range~0--255. + +The braces surrounding box material define a group; +they can be explicit characters +of categories 1 and~2 respectively, +or control sequences \cs{let} to such characters; +see also below. + + +A \gr{box} can in general be used in horizontal, vertical, +and math mode, but see below for the \cs{lastbox}. +The connection between +boxes and modes is explored further in Chapter~\ref{hvmode}. + +The box produced by \cs{vcenter} \ldash a command that is allowed only in +math mode \rdash is not a \gr{box}. For instance, +it can not be assigned with \verb=\setbox=; see further +Chapter~\ref{math}. + +The \cs{vsplit} operation is treated in Chapter~\ref{page:break}. + +%\point Box registers +\section{Box registers} + +There are 256 box registers, numbered 0--255. +\term box! registers\par +Either a box register is empty (`void'), or it contains a horizontal +or vertical box. +This section discusses specifically box {\em registers}; +the sizes of boxes, and the way material is arranged inside them, +is treated below. +\awp + +%\spoint Allocation: \cs{newbox} +\subsection{Allocation: \cs{newbox}} + +The plain \TeX\ \csidx{newbox} macro allocates an unused +box register: +\begin{verbatim} +\newbox\MyBox +\end{verbatim} +after which one can say +\begin{verbatim} +\setbox\MyBox=... +\end{verbatim} +or \begin{verbatim} +\box\MyBox +\end{verbatim} +and so on. +Subsequent calls to this macro give subsequent box numbers; +this way macro collections can allocate their own boxes +without fear of collision with other macros. + +The number of the box is assigned by \cs{chardef} +(see Chapter~\ref{alloc}). +This implies that \cs{MyBox} is equivalent to, +and can be used as, a~\gr{number}. +The control sequence +\altt +\cs{newbox} is an \cs{outer} macro. +Newly allocated box registers are initially empty. + + +\subsection{Usage: \cs{setbox}, \cs{box}, \cs{copy}} + +A~register is filled by assigning a \gr{box} +\cstoidx setbox\par +to it: +\begin{Disp}\verb>\setbox>\gr{number}\gr{equals}\gr{box}\end{Disp} +For example, the \gr{box} can be explicit +\begin{Disp}\verb>\setbox37=\hbox{...}>\quad or\quad \verb>\setbox37=\vbox{...}> +\end{Disp} +or it can be a box register: +\begin{verbatim} +\setbox37=\box38 +\end{verbatim} +Usually, box numbers will have been assigned by a \cs{newbox} +command. + +The box in a box register is appended +by the commands \cs{box} and~\cs{copy} +to whatever list \TeX\ is building: the call +\begin{verbatim} +\box38 +\end{verbatim} +appends box~38. +To save memory space, box registers become empty by using them: +\TeX\ assumes that after you have inserted a box by +calling \csidx{box}$nn$ in some mode, you do not need the +contents of that register any more and empties it. +In case you {\em do\/} need the contents of +a box register more than once, +you can \csidx{copy} it. Calling \cs{copy}$nn$ is +equivalent to \cs{box}$nn$ in all respects except that +the register is not cleared. + +It is possible to unwrap the contents of a box register +by `unboxing' it using the commands \cs{unhbox} and \cs{unvbox}, +and their copying versions \cs{unhcopy} and \cs{unvcopy}. +Whereas a box can be used in any mode, the +unboxing operations can only be used in the appropriate mode, +since in effect they contribute a partial +horizontal or vertical list (see also Chapter~\ref{hvmode}). +See below for more information on unboxing registers. +\awp + +%\spoint Testing: \cs{ifvoid}, \cs{ifhbox}, \cs{ifvbox} +\subsection{Testing: \cs{ifvoid}, \cs{ifhbox}, \cs{ifvbox}} + +Box +registers can be tested for their contents: +\begin{disp}\cs{ifvoid}\gr{number}\end{disp} +is true if the box register is empty. +Note that an empty, or `void', +box register is not the same as a register containing an empty box. +An empty box is still either a horizontal or a vertical box; +a~void register can be used as both. + +The test +\begin{disp}\cs{ifhbox}\gr{number}\end{disp} +is true if the box register contains a horizontal box; +\begin{disp}\cs{ifvbox}\gr{number}\end{disp} +is true if the box register contains a vertical box. +Both tests are false for void registers. + +%\spoint[lastbox] The \cs{lastbox} +\subsection{The \cs{lastbox}} +\label{lastbox} + +When \TeX\ has built a partial list, the last box in this +list is accessible as the \csidx{lastbox}. This behaves +like a box register, so you can remove the last box from the +list by assigning the \cs{lastbox} to some box register. +If the last item on the current list is not a box, +the \cs{lastbox} acts like a void box register. +It is not possible to get hold of the last box +in the case of the main vertical list. +The \cs{lastbox} is then always void. + +As an example, the statement \begin{verbatim} +{\setbox0=\lastbox} +\end{verbatim} +removes +the last box from the current list, assigning it to box +register~0. Since this assignment occurs inside a group, +the register is cleared at the end of the group. +At the start of a paragraph this can be used to remove the +indentation box (see Chapter~\ref{par:start}). +Another example of \cs{lastbox} can be found on page~\pageref{varioset}. + +Because the \verb-\lastbox- is always empty in external vertical mode, +it is not possible to get hold of boxes that have been +added to the page. However, it is possible to dissect +the page once it is in \cs{box255}, for instance doing +\begin{verbatim} +\vbox{\unvbox255{\setbox0=\lastbox}} +\end{verbatim} +inside the output routine. + +If boxes in vertical mode have been shifted by \cs{moveright} +or \cs{moveleft}, or if boxes in horizontal mode have +been raised by \cs{raise} or lowered by \cs{lower}, +any information about this +displacement due to such a command is lost when +the \cs{lastbox} is taken from the list. +\awp + +%\point Natural dimensions of boxes +\section{Natural dimensions of boxes} + +%\spoint Dimensions of created horizontal boxes +\subsection{Dimensions of created horizontal boxes} + +Inside an \csidx{hbox} all constituents are lined up next to each other, +\term box! dimensions\par +with their reference points on the baseline of the box, +unless they are moved explicitly in the vertical direction +by \cs{lower} or~\cs{raise}. + +The resulting width of the box is the sum of the widths +of the components. Thus the width of +\begin{verbatim} +\hbox{\hskip1cm} +\end{verbatim} +is positive, and the width of +\begin{verbatim} +\hbox{\hskip-1cm} +\end{verbatim} +is negative. By way of example, +\begin{disp}\verb>a\hbox{\kern-1em b}-->\end{disp} +gives as output +\begin{disp}\leavevmode\hphantom{b}a\hbox{\kern-1em b}--\end{disp} +\message{check align input/output} +which shows that a horizontal box can have negative +width. + +The height and depth of an \cs{hbox} are the +maximum amount that constituent boxes project above and +below the baseline of the box. They are non-negative when the +box is created. + +The commands \cs{lower} and \cs{raise} are the only possibilities +for vertical movement inside an \cs{hbox} (other than +including a \cs{vbox} inside the \cs{hbox}, of course); +a~\gr{vertical command} \ldash such as \cs{vskip} \rdash +is not allowed in a horizontal box, and +\cs{par}, although allowed, +does not do anything inside a horizontal box. + +%\spoint Dimensions of created vertical boxes +\subsection{Dimensions of created vertical boxes} + +Inside a \csidx{vbox} vertical material is lined up with the +\cstoidx vtop\par +reference points on the vertical line through the reference +point of the box, +unless components are moved explicitly in the horizontal direction +by \csidx{moveleft} or~\csidx{moveright}. + +The reference point of a vertical box +is always located at the left boundary of the box. +The width of a vertical box +is then the maximal amount that any material in the +box sticks to the right of the reference point. +Material to the left of the reference point is +not taken into account in the width. +Thus the result of +\begin{disp}\verb>a\vbox{\hbox{\kern-1em b}}-->\end{disp} +is +\begin{disp}\leavevmode\hphantom{b}a\vbox{\hbox{\kern-1em b}}--\end{disp} +This should be contrasted with the above example. + + +The calculation of height and depth is different +for vertical boxes constructed by \cs{vbox} and \cs{vtop}. +The ground rule is that +\awp +a \cs{vbox} has a reference point that lies on +the baseline of its last component, +and a \cs{vtop} has its reference point on the baseline of the +first component. +In general, the depth (height) of a \cs{vbox} (\cs{vtop}) +\alt +can be non-zero if the last (first) item is a box or rule. + +The height of a \cs{vbox} is then the sum of the heights and +depths of all components except the last, plus the height +of that last component; the depth of the \cs{vbox} is the +depth of its last component. +The depth of a \cs{vtop} +is the sum of the depth of the first component and the heights +and depths of all subsequent material; its height is the +height of the first component. + +However, the actual rules are a bit +more complicated when the first component of a \cs{vtop} +or the last component of a \cs{vbox} is not a box or rule. +If the last component of a \cs{vbox} is a kern or a glue, +the depth of that box is zero; a \cs{vtop}'s +height is zero +unless its first component is a box or rule. +\altt +(Note the asymmetry in these definitions; see below for +an example illustrating this.) +The depth of a \cs{vtop}, then, is equal to the total +height plus depth of all enclosed material minus +the height of the \cs{vtop}. + +There is a limit on the depth of vertical boxes: +if the depth of a \cs{vbox} or \cs{vtop} +calculated by the above rules would exceed +\cstoidx boxmaxdepth\par, +the reference point of the box +is moved down by the excess amount. +More precisely, the excess depth is added to the +natural height of the box. If the box had a \n{to} or +\n{spread} specification, any glue is set anew to take +the new height into account. + +Ordinarily, +\cs{boxmaxdepth} is set to the maximum dimension +possible in \TeX. It is for instance reduced during some of +the calculations in the plain \TeX\ output routine; +see Chapter~\ref{output}. + +%\spoint Examples +\subsection{Examples} + +Horizontal boxes are relatively straightforward. Their width is the +distance between the `beginning' and the `end' of the +box, +and consequently the width is not necessarily positive. +With +\begin{verbatim} +\setbox0=\hbox{aa} \setbox1=\hbox{\copy0 \hskip-\wd0} +\end{verbatim} +the \cs{box1} has width zero; +\begin{Disp} \verb-/\box1/-\quad gives\quad +`{\setbox0=\hbox{aa}\setbox1=\hbox{\copy0 \hskip-\wd0}/\box1/}\kern.75em' +\end{Disp} +The height and depth of a horizontal box cannot be negative: in +\begin{verbatim} +\setbox0=\hbox{\vrule height 5pt depth 5pt} +\setbox1=\hbox{\raise 10pt \box0} +\end{verbatim} +the \cs{box1} has depth \n{0pt} and height~\n{15pt} + +Vertical boxes are more troublesome than horizontal boxes. +Let us first treat their width. +After \begin{verbatim} +\setbox0=\hbox{\hskip 10pt} +\end{verbatim} +the box in the +\cs{box0} register has a width of \n{10pt}. Defining +\begin{verbatim} +\setbox1=\vbox{\moveleft 5pt \copy0} +\end{verbatim} +\awp +the \cs{box1} will have width \n{5pt}; material to the +left of the reference point is not accounted for in the +width of a vertical box. With +\begin{verbatim} +\setbox2=\vbox{\moveright 5pt \copy0} +\end{verbatim} +the \cs{box2} will have width \n{15pt}. + +The depth of a \cs{vbox} is the depth of the last item if +that is a box, so +\begin{verbatim} +\vbox{\vskip 5pt \hbox{\vrule height 5pt depth 5pt}} +\end{verbatim} +has height \n{10pt} and depth \n{5pt}, +and \begin{verbatim} +\vbox{\vskip -5pt \hbox{\vrule height 5pt depth 5pt}} +\end{verbatim} +has height \n{0pt} and depth~\n{5pt}. +With a glue or kern as the last item in the box, the resulting depth +is zero, so +\begin{verbatim} +\vbox{\hbox{\vrule height 5pt depth 5pt}\vskip 5pt} +\end{verbatim} +has height \n{15pt} and depth~\n{0pt}; +\begin{verbatim} +\vbox{\hbox{\vrule height 5pt depth 5pt}\vskip -5pt} +\end{verbatim} +has height \n{5pt} and depth~\n{0pt}. + +The height of a \cs{vtop} behaves (almost) the same with respect to +the first item of the box, as the depth of a \cs{vbox} does +with respect to the last item. Repeating the above examples with +a \cs{vtop} gives the following: +\begin{verbatim} +\vtop{\vskip 5pt \hbox{\vrule height 5pt depth 5pt}} +\end{verbatim} +has height \n{0pt} and depth \n{15pt}, +and \begin{verbatim} +\vtop{\vskip -5pt \hbox{\vrule height 5pt depth 5pt}} +\end{verbatim} +has height \n{0pt} and depth~\n{5pt}; +\begin{verbatim} +\vtop{\hbox{\vrule height 5pt depth 5pt} \vskip 5pt} +\end{verbatim} +has height \n{5pt} and depth~\n{10pt}, and +\begin{verbatim} +\vtop{\hbox{\vrule height 5pt depth 5pt} \vskip -5pt} +\end{verbatim} +has height \n{5pt} and depth~\n{0pt}. + +%\point More about box dimensions +\section{More about box dimensions} + +%\spoint Predetermined dimensions +\subsection{Predetermined dimensions} + +The size of a box can be specified in advance +with a \gr{box specification}; see above for the syntax. +Any glue +in the box is then set in order to reach the required size. +Prescribing the size of the box is done by +\begin{disp}\cs{hbox} \n{to} \gr{dimen} \n{\lb...\rb}, + \cs{vbox} \n{to} \gr{dimen} \n{\lb...\rb}\end{disp} +\awp +If stretchable or shrinkable glue is present in the box, +it is stretched or shrunk in order to give the box the +specified size. Associated with this glue setting is a badness value +(see Chapter~\ref{glue}). If no stretch or shrink \ldash whichever +is necessary \rdash is present, the resulting box will be underfull +or overfull respectively. Error reporting for over/underfull +boxes is treated below. + +Another command to let a box have a size other than +the natural size is +\begin{disp}\cs{hbox} \n{spread} \gr{dimen} \n{\lb...\rb}, + \cs{vbox} \n{spread} \gr{dimen} \n{\lb...\rb}\end{disp} +which tells \TeX\ to set the glue in such a way that +the size of the box is a specified amount more than the +natural size. + +Box specifications for \cs{vtop} vertical boxes are +somewhat difficult to interpret. \TeX\ constructs a \cs{vtop} +by first making a \cs{vbox}, including +glue settings induced by a \gr{box specification}; +then it computes the height and depth by the above rules. +Glue setting is described in Chapter~\ref{glue}. + +%\spoint Changes to box dimensions +\subsection{Changes to box dimensions} + +The dimensions of a box register are accessible by the +commands \csidx{ht}, \csidx{dp}, and~\csidx{wd}; +for instance \cs{dp13} gives the depth of box~13. +However, not only can boxes be measured this way; +by assigning values to these +dimensions \TeX\ can even be fooled into thinking that +a box has a size different from its actual. +However, changing the dimensions of a box does not change +anything about the contents; in particular it does not +change the way the glue is set. + + +Various formats use this in `smash' macros: the macro defined by +\cstoidx smash\par +\begin{verbatim} +\def\smash#1{{\setbox0=\hbox{#1}\dp0=0pt \ht0=0pt \box0\relax}} +\end{verbatim} +places its argument but annihilates its height and depth; +\altt +that is, the output does show the whole box, but further calculations +by \TeX\ act as if the height and depth were zero. + +Box dimensions can be changed only by setting them. +They are \gr{box dimen}s, which can only be set +in a \gr{box size assignment}, and not, for instance +changed with \cs{advance}. + +Note that a \gr{box size assignment} is a \gr{global assignment}: +its effect transcends any groups in which it occurs +(see Chapter~\ref{group}). +Thus the output of \begin{verbatim} +\setbox0=\hbox{---} {\wd0=0pt} a\box0b +\end{verbatim} +is `{\setbox0=\hbox{---}{\wd0=0pt}a\box0b}\kern.5em'. + +The limits that hold on the dimensions with which a +box can be created (see above) do not hold for explicit changes to the +\mdqon +size of a box: the assignment \cs{dp0=}""\n{-2pt} for a +\mdqoff +horizontal box is perfectly admissible. + +%\spoint Moving boxes around +\subsection{Moving boxes around} + +In a horizontal box all constituent elements are lined up +\cstoidx raise\par\cstoidx lower\par +with their reference points at the same height as the +reference point of the box. Any box inside a horizontal +box can be lifted or dropped using the macros +\cs{raise} and~\cs{lower}. +\awp + +Similarly, in a vertical box all constituent elements +are lined up with their reference points underneath one another, +in line with the reference point of the box. +Boxes can now be moved sideways by the macros +\csidx{moveleft} and~\csidx{moveright}. + +Only boxes can be shifted thus; these operations cannot +be applied to, for instance, characters or rules. + + +%\spoint Box dimensions and box placement +\subsection{Box dimensions and box placement} + +\TeX\ places the components of horizontal and +vertical lists by maintaining a reference line and a +current position on that line. For horizontal lists +the reference line is the baseline of the surrounding +\cs{hbox}; for vertical lists it is the vertical line +through the reference point of the surrounding \cs{vbox}. + +In horizontal mode a component is placed as follows. +The current position coincides initially +with the reference point of the surrounding box. After that, +the following actions are carried out. +\begin{enumerate} \item If the component has been shifted by +\cs{raise} or \cs{lower}, shift the current +position correspondingly. +\item If the component is a horizontal box, use +this algorithm recursively for its contents; +if it is a vertical box, go up by the height of this box, +putting a new current position for the enclosed vertical list there, +and place its components using the algorithm for vertical +lists below. +\item Move the current position (on the reference line) +to the right by the width of the component. +\end{enumerate} + +For the list in a vertical box \TeX's current position is +initially at the upper left corner of that box, as explained above, +and the reference line is the vertical line through that point; +it also runs through the reference point of the box. +Enclosed components are then placed as follows. +\begin{enumerate} \item If a component has been shifted using +\cs{moveleft} or \cs{moveright}, shift the current position +accordingly. +\item Put the component with its upper left corner at the +current position. +\item If the component is a vertical box, use this algorithm +recursively for its contents; if it is a horizontal box, +its reference point can be found below the current position +by the height of the box. Put the current position for that +box there, and use the above algorithm for horizontal lists. +\item Go down by the height plus depth of the box +(that is, starting at the upper left corner of the box) +on the reference line, +and continue processing vertically. +\end{enumerate} +Note that the above processes do not describe the construction +of boxes. That would (for instance) +involve for vertical boxes the insertion +of baselineskip glue. Rather, it describes the way the components +of a finished box are arranged in the output. + +%\spoint Boxes and negative glue +\subsection{Boxes and negative glue} + +Sometimes it is useful to have boxes overlapping instead of +\awp +line up. An easy way to do this is to use negative glue. +In horizontal mode +\begin{verbatim} +{\dimen0=\wd8 \box8 \kern-\dimen0} +\end{verbatim} +places box 8 without moving the current location. + +More versatile are the macros \csidx{llap} and \csidx{rlap}\label{rlap}, +defined as \begin{verbatim} +\def\llap#1{\hbox to 0pt{\hss #1}} +\end{verbatim} +and \begin{verbatim} +\def\rlap#1{\hbox to 0pt{#1\hss}} +\end{verbatim} +that allow material to protrude left or right from the +current location. +The \cs{hss} glue is equivalent to \verb>\hskip 0pt plus 1fil minus 1fil>, +which absorbs any positive or negative width +of the argument of \cs{llap} or \cs{rlap}. + +\begin{example} The sequence \begin{verbatim} +\llap{\hbox to 10pt{a\hfil}} +\end{verbatim} +is effectively the same as +\begin{verbatim} +\hbox{\hskip-10pt \hbox to 10pt{a\hfil}} +\end{verbatim} +which has a total width of~\n{0pt}. +\end{example} + +%\point[over/underfull] Overfull and underfull boxes +\section{Overfull and underfull boxes} +\label{over/underfull} + +If a box has a size specification \TeX\ will +\term box !overfull\par\term box !underfull\par +stretch or shrink glue in the box. For glue with +only finite stretch or shrink components the {\em badness\/} +(see Chapter~\ref{line:break}) of stretching or shrinking +is computed. +In \TeX\ version~3 the badness +\cstoidx badness\par\term \TeX\ version 3\par +of the box most recently +constructed is available for inspection +by the user through the \cs{badness} parameter. Values for +badness range 0--$10\,000$, but if the box is overfull +it is~$1\,000\,000$. + +When \TeX\ considers the badness too large, +it gives a diagnostic message. Let us first consider error reporting +for horizontal boxes. + +Horizontal boxes of which the glue has to stretch are never reported if +\cstoidx hbadness\par\cstoidx vbadness\par +\cs{hbadness}${}\geq10\,000$; otherwise \TeX\ reports them +as `underfull' if their badness is more than \cs{hbadness}. + +Glue shrinking can lead to `overfull' boxes: a box is called +\cstoidx hfuzz\par\cstoidx vfuzz\par +overfull if the available shrink is less than the shrink +necessary to meet the box specification. An overfull box +is only reported if the difference in shrink is more than +\cs{hfuzz}, or if \cs{hbadness}${}<100$ (and it turns out that +using all available shrinkability has badness~$100$). + +\begin{example} Setting \verb>\hfuzz=1pt> will let \TeX\ ignore +boxes that can not shrink enough if they lack less than~\n{1pt}. +In \begin{verbatim} +\hbox to 1pt{\hskip3pt minus .5pt} +\end{verbatim} +\awp +\begin{verbatim} +\hbox to 1pt{\hskip3pt minus 1.5pt} +\end{verbatim} +only the first box will give an error message: +it is \n{1.5pt} too big, whereas the second lacks +\n{.5pt} which is less than \cs{hfuzz}. +\end{example} + +Also, boxes that shrink but that are not overfull can be reported: +if a box is `tight', that is, if it uses at least half its +shrinkability, \TeX\ reports this fact if the +computed badness (which is between 13 and~100) is more than +\cs{hbadness}. + +For horizontal and vertical boxes this error reporting is almost +\cstoidx overfullrule\par +the same, with parameters \cs{vbadness} and \cs{vfuzz}. +The difference is that for horizontal overfull boxes +\TeX\ will draw a rule to the right of the box that has the +same height as the box, and width \cs{overfullrule}. +No overfull rule ensues if +the \cs{tabskip} glue in an \cs{halign} cannot be +shrunk enough. + + +%\point Opening and closing boxes +\section{Opening and closing boxes} + +The opening and closing braces of a box can be either explicit, +that is, character tokens of category 1 and~2, or implicit, +a control sequence \verb=\let= to such a character. +After the opening brace +the \csidx{everyhbox} or \csidx{everyvbox} +tokens are inserted. +If this box appeared in a \csidx{setbox} assignment +any \csidx{afterassignment} +token is inserted even before the `everybox' tokens. + +\begin{example} \label{every:box:assign}\begin{verbatim} +\everyhbox{b} +\afterassignment a +\setbox0=\hbox{c} +\showbox0 +\end{verbatim} +gives +\begin{verbatim} +> \box0= +\hbox(6.94444+0.0)x15.27782 +.\tenrm a +.\tenrm b +.\kern0.27779 +.\tenrm c +\end{verbatim} +\end{example} + +Implicit braces can be used to let a box be opened or closed +by a macro, for example: +\begin{verbatim} +\def\openbox#1{\setbox#1=\hbox\bgroup} +\def\closebox#1{\egroup\DoSomethingWithBox#1} +\openbox0 ... \closebox0 +\end{verbatim} +This mechanism can be used to scoop up paragraphs: +\begin{verbatim} +\everypar{\setbox\parbox= + \vbox\bgroup + \everypar{} + \def\par{\egroup\UseBox\parbox}} +\end{verbatim} +Here the \cs{everypar} opens the box and lets the text be +set in the box: starting for instance +\begin{verbatim} +Begin a text ... +\end{verbatim} +gives the equivalent of +\begin{verbatim} +\setbox\parbox=\vbox{Begin a text ... +\end{verbatim} +Inside the box \cs{par} has been redefined, so +\begin{verbatim} +... a text ends.\par +\end{verbatim} +is equivalent to +\begin{verbatim} +... a text ends.}\Usebox\parbox +\end{verbatim} + +In this example, the \cs{UseBox} command can only treat the +box as a whole; if the elements of the box should somehow +be treated separately another approach is necessary. +In +\begin{verbatim} +\everypar{\setbox\parbox= + \vbox\bgroup\everypar{}% + \def\par{\endgraf\HandleLines + \egroup\box\parbox}} +\def\HandleLines{ ... \lastbox ... } +\end{verbatim} +the macro \cs{HandleLines} can have access to successive +elements from the vertical list of the paragraph. +See also the example on page~\pageref{varioset}. + +%\point Unboxing +\section{Unboxing} + +Boxes can be unwrapped by the commands \csidx{unhbox} and +\term box! unboxing\par +\csidx{unvbox}, and by their copying versions +\csidx{unhcopy} and \csidx{unvcopy}. +These are horizontal and vertical commands +(see Chapter~\ref{hvmode}), considering that in effect +they contribute a partial horizontal or vertical list. +It is not possible to \cs{unhbox} a register +containing a \cs{vbox} or vice versa, +but a void box register can both be \cs{unhbox}ed and +\cs{unvbox}ed. + +Unboxing takes the contents of a box in a box register and appends +them to the surrounding list; any glue can then +be set anew. Thus +\begin{verbatim} +\setbox0=\hbox to 1cm{\hfil} \hbox to 2cm{\unhbox0} +\end{verbatim} +is completely equivalent to +\begin{verbatim} +\hbox to 2cm{\hfil} +\end{verbatim} +and not to +\begin{verbatim} +\hbox to 2cm{\kern1cm} +\end{verbatim} +\awp + +The intrinsically horizontal nature of \cs{unhbox} is +\cstoidx leavevmode\par +used to define +\begin{verbatim} +\def\leavevmode{\unhbox\voidb@x} +\end{verbatim} +This command switches from vertical mode to horizontal without +adding anything to the horizontal list. +However, the subsequent \cs{indent} caused by this transition +adds an indentation box. +In horizontal mode the \cs{leavevmode} command has no effect. +Note that here it is not necessary to use \cs{unhcopy}, +because the register is empty anyhow. + +Beware of the following subtlety: unboxing in vertical +mode does not add interline glue between the box contents and +any preceding item. +Also, the value of \cs{prevdepth} is not +changed, so glue between the box contents and any following +item will occur only if there was something preceding the box; +interline glue will be based on the depth of that preceding item. +Similarly, unboxing in horizontal mode does not influence +the \cs{spacefactor}. + +%\point Text in boxes +\section{Text in boxes} + +Both horizontal and vertical boxes can contain text. However, +\term boxes !text in\par +the way text is treated differs. +In horizontal boxes +the text is placed in one straight line, and the width of +the box is in principle the natural width of the text +(and other items) contained in it. No \gram{vertical command}s +are allowed inside a horizontal box, and \cs{par} does +nothing in this case. + +For vertical boxes the situation is radically different. +As soon as a character, or any other \gram{horizontal command} +(see page~\pageref{h:com:list}), +is encountered in a vertical box, \TeX\ starts building a paragraph +in unrestricted horizontal mode, that is, just as if the paragraph +were directly part of the page. +At the occurrence of a \gram{vertical command} +(see page~\pageref{v:com:list}), or at the end +of the box, the paragraph is broken into lines using the +current values of parameters such as~\cs{hsize}. + +Thus \begin{verbatim} +\hbox to 3cm{\vbox{some reasonably long text}} +\end{verbatim} +will {\sl not\/} give a paragraph of width 3 centimetres +(it gives an overfull horizontal box if \cs{hsize}${}>{}$\n{3cm}). +However, +\begin{verbatim} +\vbox{\hsize=3cm some reasonably long text} +\end{verbatim} +will be 3 centimetres wide. + +A paragraph of text inside a vertical box is broken into +lines, which are packed in horizontal boxes. +These boxes are then stacked +in internal vertical mode, possibly with +\cs{baselineskip} and \cs{lineskip} separating them +(this is treated in Chapter~\ref{baseline}). +This process is also used for text on the page; the boxes +are then stacked in outer vertical mode. + +If the internal vertical list is empty, no \cs{parskip} +glue is added at the start of a paragraph. + +Because text in a horizontal box is not +\label{wide:vbox}% +broken into lines, there is a further +difference between text in restricted and unrestricted +\awp +horizontal mode. In restricted horizontal mode no +discretionary nodes and whatsit items changing the +value of the current language are inserted. +This may give problems if the text is subsequently +unboxed to form part of a paragraph. + +See Chapter~\ref{line:break} for an explanation of these +items, and \cite{Downs} for a way around this problem. + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Forgetting the \cs{box} +\subsection{Forgetting the \cs{box}} + +After \verb.\newcount\foo., one can use \cs{foo} on its own +to get the \cs{foo} counter. +For boxes, however, one has to use \verb.\box\foo. to get +the \cs{foo} box. +The reason for this is that there exists +no separate \cs{boxdef} command, so \cs{chardef} is +used (see Chapter~\ref{alloc}). + +\begin{example} +Suppose \verb.\newbox\foo. allocates box register~25; then +typing \cs{foo} is equivalent to typing +\verb.\char25.. +\end{example} + +%\spoint Special-purpose boxes +\subsection{Special-purpose boxes} + +Some box registers +have a special +purpose: +\begin{itemize} +\item \cs{box255} is by used \TeX\ internally + to give the page to the output routine. +\item \cs{voidb@x} is the number of + a box register allocated in + \n{plain.tex}; it is supposed to be empty always. + It is used in the macro \cs{leavevmode} and others. +\item when a new \cs{insert} is created with the plain \TeX\ + \cs{newinsert} macro, a \cs{count}, + \cs{dimen}, \cs{skip}, and \cs{box} all with the same number + are reserved for that insert. + The numbers for these registers count down from~254. +\end{itemize} + + +%\spoint The height of a vertical box in horizontal mode +\subsection{The height of a vertical box in horizontal mode} + +In horizontal mode a vertical box is placed with its +reference point aligned vertically with the reference +point of the surrounding box. +\TeX\ then traverses its contents starting at the left +upper corner; that is, the point that lies above the reference +point by a distance of the height of the box. +Changing the height of the box implies then that the +contents of the box are placed at a different height. + +Consider as an example +\begin{verbatim} +\hbox{a\setbox0=\vbox{\hbox{b}}\box0 c} +\end{verbatim} +which gives +\begin{disp}\leavevmode\hbox{a\setbox0=\vbox{\hbox{b}}\box0 c}\end{disp} +and +\begin{verbatim} +\hbox{a\setbox0=\vbox{\hbox{b}}\ht0=0cm \box0 c} +\end{verbatim} +\awp +which gives +\begin{disp}\leavevmode\hbox{a\setbox0=\vbox{\hbox{b}}\ht0=0cm \box0 c}\end{disp} + +By contrast, changing the width of a box placed in vertical +mode has no effect on its placement. + +%\spoint More subtleties with vertical boxes +\subsection{More subtleties with vertical boxes} + +Since there are two kinds of vertical boxes, the \cs{vbox} and +the \cs{vtop}, using these two kinds nested may lead to +confusing results. For instance, \begin{verbatim} +\vtop{\vbox{...}} +\end{verbatim} +is completely equivalent to just \begin{verbatim} +\vbox{...} +\end{verbatim} + +It was stated above that +the depth of a \cs{vbox} is zero if the last item +is a kern or glue, and the height of a \cs{vtop} is +zero unless the first item in it is a box. +The above examples used a kern for that first or last item, +but if, in the case of a \cs{vtop}, +this item is not a glue or kern, one is apt to +overlook the effect that it has on the surrounding box. +For instance, +\begin{verbatim} +\vtop{\write16{...}...} +\end{verbatim} +has zero height, +because the write instruction +is packed into a `whatsit' item that is placed on the current, +that is, the vertical, list. +The remedy here is +\begin{verbatim} +\vtop{\leavevmode\write16{...}...} +\end{verbatim} +which puts the whatsit in the beginning of the paragraph, +instead of above it. + +Placement of items in a vertical list is sometimes +a bit tricky. There is for instance a difference between +how vertical and horizontal boxes are treated in a +vertical list. Consider the following examples. +After \cs{offinterlineskip} the first example\begin{verbatim} +\vbox{\hbox{a} + \setbox0=\vbox{\hbox{(}} + \ht0=0pt \dp0=0pt \box0 + \hbox{ b}} +\end{verbatim} +gives \begin{disp}\offinterlineskip\leavevmode\vbox{\hbox{a} + \setbox0=\vbox{\hbox{(}} + \ht0=0pt \dp0=0pt \box0 + \hbox{ b}} +\end{disp} +while a slight variant\begin{verbatim} +\vbox{\hbox{a} + \setbox0=\hbox{(} + \ht0=0pt \dp0=0pt \box0 + \hbox{ b}} +\end{verbatim} +\awp +gives +\begin{disp}\offinterlineskip\leavevmode\vbox{\hbox{a} + \setbox0=\hbox{(} + \ht0=0pt \dp0=0pt + \box0 + \hbox{ b}} +\end{disp} +The difference is caused by the fact that horizontal boxes +are placed with respect to their reference point, but vertical +boxes with respect to their upper left corner. + +%\spoint Hanging the \cs{lastbox} back in the list +\subsection{Hanging the \cs{lastbox} back in the list} + +You can pick the last box off a vertical list that has been +compiled in (internal) vertical mode. +However, if you try to hang it back in the list the vertical +spacing may go haywire. If you just hang it back, +\begin{verbatim} +\setbox\tmpbox=\lastbox +\usethetmpbox \box\tmpbox +\end{verbatim} +baselineskip glue is added a second time. If you `unskip' prior +to hanging the box back, +\begin{verbatim} +\setbox\tmpbox=\lastbox \unskip +\usethetmpbox \box\tmpbox +\end{verbatim} +things go wrong in a more subtle way. +The \gram{internal dimen} \cs{prevdepth} +(which controls interline glue; see Chapter~\ref{baseline}) +will have a +value based on the last box, but what you need for the proper +interline glue is a depth based on one box earlier. +The solution is not to unskip, +but to specify \cs{nointerlineskip}: +\begin{verbatim} +\setbox\tmpbox=\lastbox +\usethetmpbox \nointerlineskip \box\tmpbox +\end{verbatim} + + +%\spoint[varioset] Dissecting paragraphs with \cs{lastbox} +\subsection{Dissecting paragraphs with \cs{lastbox}} +\label{varioset} + +Repeatedly applying \cs{last...} and \cs{un...} macros +\howto Take a paragraph apart\par +can be used to take a paragraph apart. +Here is an example of that. + +\indent\vbox{\message{Check vario look!} +\hyphenpenalty10000 \exhyphenpenalty10000 %\Indent:no +\advance\hsize by -2\parindent +\newif\ifsnap \spaceskip=\fontdimen2\font plus \fontdimen3\font +\def\eatlines{ + \setbox2\lastbox % check the last line + \ifvoid2\global\snaptrue + \else % if it's not empty + \unskip\unpenalty % take whatever is + {\eatlines} % above it; + \setbox4\hbox{\unhcopy2} % collapse this line + \ifdim\wd4<.98\wd2 % if the difference is too large, + \ifsnap \box2 \global\snapfalse + \else \box4 \global\snaptrue + \fi + \else \box2 \global\snapfalse + \fi + \fi} +In typesetting advertisement copy, a way of justifying +paragraphs has become popular in recent years +that is somewhere between flushright and raggedright +setting. +Lines that would stretch beyond certain limits +are set with their glue at natural width. This paragraph +exemplifies this procedure; the macros +follow next.\par\eatlines}\par + +\begin{verbatim} +\newbox\linebox \newbox\snapbox +\def\eatlines{ + \setbox\linebox\lastbox % check the last line + \ifvoid\linebox + \else % if it's not empty + \unskip\unpenalty % take whatever is + {\eatlines} % above it; + % collapse the line + \setbox\snapbox\hbox{\unhcopy\linebox} + % depending on the difference + \ifdim\wd\snapbox<.98\wd\linebox + \box\snapbox % take the one or the other, + \else \box\linebox \fi + \fi} +\end{verbatim} +This macro can be called as +\begin{verbatim} +\vbox{ ... some text ... \par\eatlines} +\end{verbatim} +or it can be inserted automatically +with \cs{everypar}; see~\cite{E1}. + +In the macro \cs{eatlines}, the \cs{lastbox} is taken +from a vertical list. If the list is empty +the last box will test true on \cs{ifvoid}. +These boxes containing lines from a paragraph +are actually horizontal boxes: the test +\cs{ifhbox} applied to them would give a true +result. + +%%%% end of input file [boxes] + +%\InputFile:modes +%%%% this is input file [modes] +%\subject[hvmode] Horizontal and \nl Vertical Mode +\endofchapter +\chapter{Horizontal and Vertical Mode}\label{hvmode} + + +At any point in its processing \TeX\ is in some mode. +\term mode\par +There are six modes, divided in three categories: +\begin{enumerate} \item horizontal mode and restricted horizontal +mode, \item vertical mode and internal vertical mode, and +\item math mode and display math mode.\end{enumerate} +The math modes will be treated elsewhere (see page~\pageref{math:modes}). +Here we shall look +at the horizontal and vertical modes, the kinds of objects +that can occur in the corresponding lists, and the +commands that are exclusive for one mode or the other. + + +\begin{inventory} +\item [\cs{ifhmode}] + Test whether the current mode is (possibly restricted) horizontal mode. + +\item [\cs{ifvmode}] + Test whether the current mode is (possibly internal) vertical mode. + +\item [\cs{ifinner}] + Test whether the current mode is an internal mode. + +\item [\cs{vadjust}] + Specify vertical material for the enclosing vertical list + while in horizontal mode. + +\item [\cs{showlists}] + Write to the log file the contents of the partial lists + currently being built in all modes. +\end{inventory} + +%\point Horizontal and vertical mode +\section{Horizontal and vertical mode} + +When not typesetting mathematics, \TeX\ is in horizontal +or vertical mode, building horizontal or vertical lists +respectively. Horizontal mode is typically used to +make lines of text; vertical mode is typically used +to stack the lines of a paragraph on top of each other. +Note that +these modes +are different from the internal states of \TeX's input processor +(see page~\pageref{input:states}). + +%\spoint Horizontal mode +\subsection{Horizontal mode} + +The main activity in horizontal mode is building lines of text. +\term mode !horizontal\par +Text on the page and text in a \cs{vbox} or \cs{vtop} is built in +horizontal mode (this might be called `paragraph mode'); +if the text is in an \cs{hbox} there is only one line +of text, and the corresponding mode is the restricted +\awp +horizontal mode. + +In horizontal mode all material is added to a horizontal list. +If this list is built in unrestricted horizontal mode, it +will later be broken into lines and added to the surrounding vertical list. + +Each element of a horizontal list is one of the following: +\term list !horizontal\par +\begin{itemize} \item a box (a character, ligature, \cs{vrule}, +or a \gr{box}), +\item a discretionary break, +\item a whatsit (see Chapter~\ref{io}), +\item vertical material enclosed in \cs{mark}, +\cs{vadjust}, or \cs{insert}, +\item +\mdqon +glue or leaders, a kern, a penalty, or a math-on/""off item. +\mdqoff +\end{itemize} +The items in the last point are all discardable. +Discardable items are called that, because they disappear in +\term discardable items\par +a break. Breaking of horizontal +lists is treated in Chapter~\ref{line:break}. + +%\spoint Vertical mode +\subsection{Vertical mode} + +Vertical mode can be used to stack items on top of one another. +\term mode !vertical\par +Most of the time, these items are boxes +containing the lines of paragraphs. + +Stacking material can take place inside a +vertical box, but the +items that are stacked can also +appear by themselves on the page. In the latter case +\TeX\ is in vertical mode; in the former case, inside a +vertical box, \TeX\ operates in internal vertical mode. + +In vertical mode all material is added to a vertical list. +If this list is built in external vertical mode, it +will later be broken when pages are formed. + +Each element of a vertical list is one of the following: +\term list !vertical\par +\begin{itemize} \item a box (a horizontal or vertical box or +an \cs{hrule}), +\item a whatsit, +\item a mark, +\item glue or leaders, a kern, or a penalty.\end{itemize} +The items in the last point are all discardable. +Breaking of vertical lists +is treated in Chapter~\ref{page:break}. + +There are a few exceptional conditions at the beginning +of a vertical list: the value of \cs{prevdepth} is set +to \n{-1000pt}. Furthermore, no \cs{parskip} glue is added +at the top of an internal vertical list; +at the top of the main vertical list (the top of the +`current page') no glue or other discardable items +are added, and \cs{topskip} glue is added when the +first box is placed on this list +(see Chapters \ref{page:shape} and~\ref{page:break}). + +%\point Horizontal and vertical commands +\section{Horizontal and vertical commands} + +Some commands are so intrinsically horizontal or vertical +in nature that they force \TeX\ to go into that mode, if +possible. A~command that forces \TeX\ into horizontal mode +is called a \gr{horizontal command}; similarly a command that +forces \TeX\ into vertical mode is called a +\awp +\gr{vertical command}. + +However, not all transitions are possible: +\TeX\ can switch from both vertical modes to +(unrestricted) horizontal mode and back +through horizontal and vertical commands, but no transitions +to or from restricted horizontal mode are possible +(other than by enclosing horizontal boxes in vertical boxes or +the other way around). +A~vertical command in restricted horizontal mode thus gives +an error; the \cs{par} command in restricted horizontal mode +has no effect. + +The horizontal commands are the following: +\label{h:com:list}\term horizontal commands\par +\begin{itemize} +\item any \gr{letter}, \gr{otherchar}, \cs{char}, +a control sequence defined by \cs{chardef}, or \cs{noboundary}; +\item \cs{accent}, \cs{discretionary}, the discretionary +hyphen~\verb|\-| and control space~\verb|\|\n{\char32}; +\item \cs{unhbox} and \cs{unhcopy}; +\item \cs{vrule} and the +\gr{horizontal skip} commands +\cs{hskip}, \cs{hfil}, \cs{hfill}, \cs{hss}, and \cs{hfilneg}; +\item \cs{valign}; +\item math shift (\n\$). +\end{itemize} + +The vertical commands are the following: +\label{v:com:list}\term vertical! commands\par +\begin{itemize} +\item \cs{unvbox} and \cs{unvcopy}; +\item \cs{hrule} and the \gr{vertical skip} commands + \cs{vskip}, \cs{vfil}, \cs{vfill}, \cs{vss}, and \cs{vfilneg}; +\item \cs{halign}; +\item \cs{end} and \cs{dump}. +\end{itemize} +Note that the vertical commands do not include \cs{par}; +nor are \cs{indent} and \cs{noindent} horizontal commands. + +The connection between boxes and modes is explored below; +see Chapter~\ref{rules} for more on the connection between +rules and modes. + +%\point The internal modes +\section{The internal modes} + +Restricted horizontal mode and internal vertical mode +\term mode !restricted\par\term mode !internal\par +are the variants of horizontal mode and vertical mode +that hold inside an \cs{hbox} and \cs{vbox} (or \cs{vtop} +or \cs{vcenter}) respectively. +However, restricted horizontal mode is rather more +restricted in nature than internal vertical mode. +The third internal mode is non-display math mode +(see Chapter~\ref{math}). + +%\spoint Restricted horizontal mode +\subsection{Restricted horizontal mode} + +The main difference between restricted horizontal mode, +the mode in an \cs{hbox}, and unrestricted horizontal mode, +the mode in which paragraphs in vertical boxes +and on the page are built, +is that you cannot break out of restricted horizontal mode: +\cs{par}~does nothing in this mode. +Furthermore, a~\gram{vertical command} in restricted horizontal +mode gives an error. +In unrestricted horizontal mode it would cause a +\cs{par} token to be inserted and vertical mode to be entered +(see also Chapter~\ref{par:end}). +\awp + +%\spoint Internal vertical mode +\subsection{Internal vertical mode} + +Internal vertical mode, the vertical mode inside +a~\cs{vbox}, is a lot like external vertical +mode, the mode in which pages are built. +A~\gram{horizontal command} in internal vertical mode, +for instance, is perfectly valid: +\TeX\ then starts building a paragraph in +unrestricted horizontal mode. + +One difference is that the commands +\cs{unskip} and \cs{unkern} have no effect +in external vertical mode, and +\cs{lastbox} is always empty in external vertical mode. +See further pages \pageref{lastbox} and~\pageref{unskip}. + +The entries of alignments (see Chapter~\ref{align}) are +processed in internal modes: restricted horizontal mode +for the entries of an \cs{halign}, and internal vertical +mode for the entries of a~\cs{valign}. +The material in \cs{vadjust} and \cs{insert} items +is also processed in internal vertical mode; furthermore, +\TeX\ enters this mode when processing the \cs{output} token list. + +The commands \cs{end} and \cs{dump} (the latter exists only in \IniTeX) +are not allowed in +internal vertical mode; furthermore, \cs{dump} is not allowed +inside a group (see Chapter~\ref{TeXcomm}). + + +%\point[hvbox] Boxes and modes +\section{Boxes and modes} +\label{hvbox} + +There are horizontal and vertical boxes, and there is +horizontal and vertical mode. Not surprisingly, there is +a connection between the boxes and the modes. +One can ask about this connection in two ways. + +%\spoint What box do you use in what mode? +\subsection{What box do you use in what mode?} + +This is the wrong question. Both horizontal and vertical boxes +can be used in both horizontal and vertical mode. +Their placement is determined by the prevailing mode at that moment. + +%\spoint What mode holds in what box? +\subsection{What mode holds in what box?} + +This is the right question. +When an \cs{hbox} starts, \TeX\ is in restricted horizontal +mode. Thus everything in a horizontal box is lined up horizontally. + +When a \cs{vbox} is started, \TeX\ is in internal vertical mode. +Boxes of both kinds and other items are then stacked +on top of each other. + + +%\spoint Mode-dependent behaviour of boxes +\subsection{Mode-dependent behaviour of boxes} + +Any \gr{box} (see Chapter \ref{boxes} for the full definition) +can be used in horizontal, vertical, and math mode. +Unboxing commands, however, are specific for horizontal or vertical mode. +Both \cs{unhbox} and \cs{unhcopy} are \gr{horizontal command}s, +so they can make \TeX\ switch from vertical to horizontal +mode; +\awp +both \cs{unvbox} and \cs{unvcopy} are \gr{vertical command}s, +so they can make \TeX\ switch from horizontal to vertical +mode. + +In horizontal mode the \cs{spacefactor} is set to 1000 +after a box has been placed. In vertical mode the +\cs{prevdepth} is set to the depth of the box placed. +Neither statement holds for +unboxing commands: after an \cs{unhbox} or \cs{unhcopy} the +spacefactor is not altered, and after \cs{unvbox} or \cs{unvcopy} +the \cs{prevdepth} remains unchanged. +After all, these commands do not add a box, +but a piece of a~(horizontal or vertical) list. + +The operations \cs{raise} and \cs{lower} can only be +applied to a box in horizontal mode; similarly, \cs{moveleft} and +\cs{moveright} can only be applied in vertical mode. + + +%\point Modes and glue +\section{Modes and glue} + +Both in horizontal and vertical mode +\TeX\ can insert glue items the size of which is +determined by the preceding object in the list. + +For horizontal mode the amount of glue that is inserted +for a space token depends on the \cs{spacefactor} of +the previous object in the list. This is treated +in Chapter~\ref{space}. + +In vertical mode \TeX\ inserts glue to keep boxes at a certain +distance from each other. This glue is influenced by the +height of the current item and the depth of the previous one. +The depth of items is recorded in the \cs{prevdepth} parameter +(see Chapter~\ref{baseline}). + +The two quantities \cs{prevdepth} +and \cs{spacefactor} +use the same internal register of \TeX. Thus the \cs{prevdepth} +can be used or asked only in vertical mode, and the \cs{spacefactor} +only in horizontal mode. + +%\point[migrate] Migrating material +\section{Migrating material} +\label{migrate} + +The three control sequences \cs{insert}, \cs{mark}, and \cs{vadjust} +can be given in a paragraph +\term migrating material\par +(the first two can also occur +in vertical mode) to specify material that will wind up on the +surrounding vertical list. Note that this need not be +the main vertical list: it can be a vertical box +containing a paragraph of text. In this case a \cs{mark} +or \cs{insert} command will not reach the page breaking algorithm. + +When several migrating items are specified in a certain line +of text, their left-to-right order is preserved when they are +placed on the surrounding vertical list. These items are placed +directly after the horizontal box containing the line of text +in which they were specified: they come before any +penalty or glue items that are automatically inserted +(see page~\pageref{between:lines}). + +%\spoint \cs{vadjust} +\subsection{\cs{vadjust}} + +The command +\cstoidx vadjust\par +\begin{disp}\cs{vadjust}\gr{filler}\lb\gr{vertical mode material}\rb\end{disp} +\awp +is only allowed in horizontal and math modes (but it is +not a \gr{horizontal command}). +Vertical mode material specified by \cs{vadjust} is moved from +the horizontal list in which the command is given +to the surrounding vertical list, directly after the box +in which it occurred. + +In the current line +\vadjust{\setbox0=\hbox{$\bullet$\hskip1em}\ht0=0pt \dp0=0pt \llap{\box0}} +a \cs{vadjust} item was placed to put the bullet in the margin. + + +Any vertical material in a \cs{vadjust} item is processed +in internal vertical mode, even though it will wind up +on the main vertical list. For instance, the \cs{ifinner} +test is true in a \cs{vadjust}, and at the start +\mdqon +of the vertical material \cs{prevdepth}$=$""\n{-1000pt}. +\mdqoff + +%\point Testing modes +\section{Testing modes} + +The three conditionals \cs{ifhmode}, \cs{ifvmode}, and +\cs{ifinner} can distinguish between the four modes of +\TeX\ that are not math modes. +The \cs{ifinner} test is true if \TeX\ is in +restricted horizontal mode or internal vertical mode +(or in non-display math mode). +Exceptional condition: during a \cs{write} \TeX\ +is in a `no mode' state. The tests \cs{ifhmode}, +\cs{ifvmode}, and \cs{ifmmode} are then all false. + +Inspection of all current lists, including the `recent +contributions' (see Chapter~\ref{page:break}), +is possible through the command \csidx{showlists}\label{showlists}. +This command writes to the log file the contents of all +lists that are being built at the moment the command is given. + +Consider the example \begin{verbatim} +a\hfil\break b\par +c\hfill\break d +\hbox{e\vbox{f\showlists +\end{verbatim} +Here the first paragraph has been broken into two lines, and +these have been added to the current page. The second paragraph +has not been concluded or broken into lines. + +The log file shows the following. \TeX\ was busy +building a paragraph (starting with an indentation box +\n{20pt} wide):\begin{verbatim} +### horizontal mode entered at line 3 +\hbox(0.0+0.0)x20.0 +\tenrm f +spacefactor 1000 +\end{verbatim} +This paragraph was inside a vertical box:\begin{verbatim} +### internal vertical mode entered at line 3 +prevdepth ignored +\end{verbatim} +The vertical box was in a horizontal box, +\begin{verbatim} +### restricted horizontal mode entered at line 3 +\tenrm e +spacefactor 1000 +\end{verbatim} +\awp +which was part of +an as-yet unfinished paragraph:\begin{verbatim} +### horizontal mode entered at line 2 +\hbox(0.0+0.0)x20.0 +\tenrm c +\glue 0.0 plus 1.0fill +\penalty -10000 +\tenrm d +etc. +spacefactor 1000 +\end{verbatim} +Note how the infinite glue and the \cs{break} penalty +are still part of the horizontal list. + +Finally, the first paragraph has been broken into lines and +added to the current page:\begin{verbatim} +### vertical mode entered at line 0 +### current page: +\glue(\topskip) 5.69446 +\hbox(4.30554+0.0)x469.75499, glue set 444.75497fil +.\hbox(0.0+0.0)x20.0 +.\tenrm a +.\glue 0.0 plus 1.0fil +.\penalty -10000 +.\glue(\rightskip) 0.0 +\penalty 300 +\glue(\baselineskip) 5.05556 +\hbox(6.94444+0.0)x469.75499, glue set 464.19943fil +.\tenrm b +.\penalty 10000 +.\glue(\parfillskip) 0.0 plus 1.0fil +.\glue(\rightskip) 0.0 +etc. +total height 22.0 plus 1.0 + goal height 643.20255 +prevdepth 0.0 +\end{verbatim} + + + +%%%% end of input file [modes] + +%\InputFile:number +%%%% this is input file [number] +%\subject[number] Numbers +\endofchapter +\chapter{Numbers}\label{number} + +In this chapter integers and their +denotations will be treated, +the conversions that are possible either way, +allocation and use of \cs{count} registers, and +arithmetic with integers. + +\begin{inventory} +\item [\cs{number}] + Convert a \gr{number} to decimal representation. + +\item [\cs{romannumeral}] + Convert a positive \gr{number} to lowercase roman representation. + +\item [\cs{ifnum}] + Test relations between numbers. + +\item [\cs{ifodd}] + Test whether a number is odd. + +\item [\cs{ifcase}] + Enumerated case statement. + + +\item [\cs{count}] + Prefix for count registers. + +\item [\cs{countdef}] + Define a control sequence to be a synonym for + a~\cs{count} register. + +\item [\cs{newcount}] + Allocate an unused \cs{count} register. + +\item [\cs{advance}] + Arithmetic command to add to or subtract from + a~\gr{numeric variable}. + +\item [\cs{multiply}] + Arithmetic command to multiply a \gr{numeric variable}. + +\item [\cs{divide}] + Arithmetic command to divide a \gr{numeric variable}. + +\end{inventory} + + +%\point Numbers and \gr{number}s +\section{Numbers and \gr{number}s} + +An important part of the grammar of \TeX\ +\term numbers\par\term integers\par +is the rigorous definition of a \gr{number}, the syntactic +entity that \TeX\ expects when semantically an integer is +expected. This definition will take the largest part of this +chapter. Towards the end, \cs{count} registers, arithmetic, +and tests for numbers are treated. + +For clarity of discussion a distinction will be made +here between integers and numbers, +but note that a \gr{number} can be both +an `integer' and a `number'. +`Integer' will be taken to denote a mathematical number: +a~quantity that can be added or multiplied. +`Number' will be taken to refer to the printed representation +of an integer: a string of digits, in other words. + +%\point Integers +\section{Integers} + +Quite a few different sorts of objects can function +as integers in \TeX. In this section they will all +be treated, accompanied by the relevant lines from +the grammar of \TeX. +\awp + +First of all, an integer can be positive or negative: +\begin{disp}\gr{number} $\longrightarrow$ +\gr{optional signs}\gr{unsigned number}\nl +\gr{optional signs} $\longrightarrow$ \gr{optional spaces}\nl +\indent $|$ \gr{optional signs}\gr{plus or minus}\gr{optional spaces} +\end{disp} + +A first possibility for an unsigned integer is a string of digits +in decimal, octal, or hexadecimal notation. +Together with the alphabetic constants these will be named +here \gr{integer denotation}. +Another possibility for an integer is an +internal integer quantity, an \gr{internal integer}; +together with the denotations these form the +\gr{normal integer}s. +Lastly an integer can be a \gr{coerced integer}: +an internal \gr{dimen} or \gr{glue} +quantity that is converted to an integer value. +\begin{disp}\gr{unsigned number} $\longrightarrow$ \gr{normal integer} +$|$ \gr{coerced integer}\nl +\gr{normal integer} $\longrightarrow$ \gr{integer denotation} +$|$ \gr{internal integer}\nl +\gr{coerced integer} $\longrightarrow$ \gr{internal dimen} +$|$ \gr{internal glue}\end{disp} +All of these possibilities will be treated in sequence. + + +%\spoint[int:denotation] Denotations: integers +\subsection{Denotations: integers} +\label{int:denotation} + +Anything that looks like a number +can be used as a \gr{number}: thus \verb-42- is a number. +However, bases other than decimal can also be used: +\begin{verbatim} +'123 +\end{verbatim} +is the octal notation for $1\times8^2+2\times8^1+3\times8^0=83$, +and \begin{verbatim} +"123 +\end{verbatim} +is the hexadecimal notation +for $1\times16^2+2\times16^1+3\times16^0=291$. +\begin{disp}\gr{integer denotation} $\longrightarrow$ +\gr{integer constant}\gr{one optional space} \nl +\indent $|$ \n{\char`\'}\gr{octal constant}\gr{one optional space}\nl +\indent $|$ \n{\char`\"}\gr{hexadecimal constant}\gr{one optional space} +\end{disp} +The octal digits are \n0--\n7; a~digit \n8 or~\n9 following an +octal denotation is not part of the number: +after \begin{verbatim} +\count0='078 +\end{verbatim} +the \cs{count0} will have the value~7, and the +digit~\n8 is typeset. + +The hexadecimal digits are \n0--\n9, \n A--\n F, +where the \n A--\n F can +have category code 11 or~12. The latter has a somewhat +far-fetched justification: the characters resulting from a +\cs{string} operation have category code~12. +Lowercase \n a--\n f are not +hexadecimal digits, although (in \TeX3) they are used +for hexadecimal notation in +the `circumflex method' for accessing all character codes +(see Chapter~\ref{char}). + +%\spoint Denotations: characters +\subsection{Denotations: characters} + +A character token is a pair consisting of a character code, +which is a~number in the range 0--255, +and a category code. Both of these codes are accessible, +and can be used as a \gr{number}. +\awp + +The character code of a character token, or of a single letter +control sequence, is accessible through the left quote command: +both \verb-`a- and~\verb-`\a- denote the character code of~{\tt a}, +which can be used as an integer. +\begin{disp}\gr{integer denotation} $\longrightarrow$ +\n{\char`\`}\gr{character token}\gr{one optional space}\end{disp} + +In order to emphasize that accessing the character code is +in a sense using a denotation, the syntax of \TeX\ allows +an optional space after such a `character constant'. +The left quote must have category~12. + +%\spoint Internal integers +\subsection{Internal integers} + +The class of \gr{internal integers} can +be split into five parts. +The \gr{codename}s and \gr{special integer}s +will be treated separately below; furthermore, there are the following. + +\begin{itemize} \item The contents of \cs{count} registers; +either explicitly used by writing for instance \cs{count23}, +or by referring to such a register by means of a +control sequence +that was defined by \cs{countdef}: +after \begin{verbatim} +\countdef\MyCount=23 +\end{verbatim} +\cs{MyCount} is called a +\gr{countdef token}, and it is fully equivalent to \cs{count23}. + +\item All parameters of \TeX\ that hold integer values; +this includes obvious ones such as \cs{linepenalty}, but +also parameters such as +\cs{hyphenchar}\gr{font} and \cs{parshape} +(if a paragraph shape has been defined for $n$ lines, +using \cs{parshape} in the context of a \gr{number} +will yield this value of~$n$). + +\item\label{num:chardef} Tokens defined by \cs{chardef} or \cs{mathchardef}. +After \begin{verbatim} +\chardef\foo=74 +\end{verbatim} +the control sequence \cs{foo} +can be used on its own to mean \cs{char74}, but in a context +where a \gr{number} is wanted it can be used to denote~74: +\begin{verbatim} +\count\foo +\end{verbatim} +is equivalent to \verb=\count74=. +This fact is +exploited in the allocation routines for registers (see +Chapter~\ref{alloc}). + +A control sequence thus defined by \cs{chardef} is called a +\gr{chardef token}; if it is defined by \cs{mathchardef} it +is called a \gr{mathchardef token}. + +\end{itemize} + +Here is the full list: +\begin{disp}\gr{internal integer} $\longrightarrow$ +\gr{integer parameter} \nl +\indent $|$ \gr{special integer} $|$ \cs{lastpenalty}\nl +\indent $|$ \gr{countdef token} $|$ \cs{count}\gr{8-bit number}\nl +\indent $|$ \gr{chardef token} $|$ \gr{mathchardef token}\nl +\indent $|$ \gr{codename}\gr{8-bit number}\nl +\indent $|$ \cs{hyphenchar}\gr{font} $|$ \cs{skewchar}\gr{font} +$|$ \cs{parshape}\nl +\indent $|$ \cs{inputlineno} $|$ \cs{badness}\nl +\gr{integer parameter} $\longrightarrow$\vadjust{\nobreak} +$|$ \cs{adjdemerits} $|$ \cs{binoppenalty}\nl +\indent $|$ \cs{brokenpenalty} $|$ \cs{clubpenalty} $|$ \cs{day}% +\awp +\nl +\indent $|$ \cs{defaulthyphenchar} $|$ \cs{defaultskewchar} \nl +\indent $|$ \cs{delimiterfactor} $|$ \cs{displaywidowpenalty} \nl +\indent $|$ \cs{doublehyphendemerits} $|$ \cs{endlinechar} + $|$ \cs{escapechar}\nl +\indent $|$ \cs{exhypenpenalty} $|$ \cs{fam} $|$ \cs{finalhyphendemerits}\nl +\indent $|$ \cs{floatingpenalty} $|$ \cs{globaldefs} $|$ \cs{hangafter}\nl +\indent $|$ \cs{hbadness} $|$ \cs{hyphenpenalty} + $|$ \cs{interlinepenalty}\nl +\indent $|$ \cs{linepenalty} $|$ \cs{looseness} $|$ \cs{mag}\nl +\indent $|$ \cs{maxdeadcycles} $|$ \cs{month} \nl +\indent $|$ \cs{newlinechar} $|$ \cs{outputpenalty} $|$ \cs{pausing}\nl +\indent $|$ \cs{postdisplaypenalty} $|$ \cs{predisplaypenalty}\nl +\indent $|$ \cs{pretolerance} $|$ \cs{relpenalty} $|$ \cs{showboxbreadth}\nl +\indent $|$ \cs{showboxdepth} $|$ \cs{time} $|$ \cs{tolerance}\nl +\indent $|$ \cs{tracingcommands} $|$ \cs{tracinglostchars} + $|$ \cs{tracingmacros}\nl +\indent $|$ \cs{tracingonline} $|$ \cs{tracingoutput} + $|$ \cs{tracingpages}\nl +\indent $|$ \cs{tracingparagraphs} $|$ \cs{tracingrestores} + $|$ \cs{tracingstats}\nl +\indent $|$ \cs{uchyph} $|$ \cs{vbadness} $|$ \cs{widowpenalty} + $|$ \cs{year} +\end{disp} + +Any internal integer can function as an \gr{internal unit}, +which \ldash preceded by \gr{optional spaces} \rdash +can serve as a \gr{unit of measure}. +Examples of this are given in Chapter~\ref{glue}. + +%\spoint Internal integers: other codes of a character +\subsection{Internal integers: other codes of a character} + +The \cs{catcode} command +(which was described in Chapter~\ref{mouth}) +is a \gr{codename}, and like the other code names +it can be used as an integer. +\begin{disp}\gr{codename} $\longrightarrow$ \cs{catcode} $|$ \cs{mathcode} +$|$ \cs{uccode} $|$ \cs{lccode}\nl \indent $|$ \cs{sfcode} $|$ \cs{delcode} +\end{disp} +A~\gr{codename} has to be followed by an \gr{8-bit number}. + +Uppercase and lowercase codes were treated in Chapter~\ref{char}; +the \cs{sfcode} is treated +in Chapter~\ref{space}; +the \cs{mathcode} and~\cs{delcode} are treated in +Chapter~\ref{mathchar}. + +%\spoint[special:int:list] \gr{special integer} +\subsection{\gr{special integer}} +\label{special:int:list} + +One of the subclasses of the internal integers is +that of the special integers. +\begin{disp}\gr{special integer} $\longrightarrow$ +\cs{spacefactor} $|$ \cs{prevgraf}\nl +\indent $|$ \cs{deadcycles} $|$ \cs{insertpenalties} +\end{disp} +An assignment to any of these is called an \gr{intimate +assignment}, and is automatically global +(see Chapter~\ref{group}). + +%\spoint Other internal quantities: coersion to integer +\subsection{Other internal quantities: coersion to integer} + +\TeX\ provides a conversion between dimensions and integers: +if an integer is expected, a \gr{dimen} or \gr{glue} used +in that context is converted by taking its +\awp +(natural) size +in scaled points. +However, only \gr{internal dimen}s and \gr{internal glue} +can be used this way: no dimension or glue denotations +can be coerced to integers. + +%\spoint Trailing spaces +\subsection{Trailing spaces} + +The syntax of \TeX\ defines integer denotations (decimal, +octal, and hexadecimal) and `back-quoted' character tokens +to be followed by \gr{one optional space}. This means that +\TeX\ reads the token after the number, absorbing it +if it was a space token, and backing up if it was not. + +Because \TeX's input processor goes into the state `skipping spaces' +after it has seen one space token, this +scanning behaviour implies that +integer denotations can be followed by +arbitrarily many space characters in the input. +Also, a line end is admissible. +However, only one space token is allowed. + +%\point Numbers +\section{Numbers} + +\TeX\ can perform an implicit conversion from a string +\term number! conversion\par\term number!roman numerals\par +\cstoidx number\par\cstoidx romannumeral\par +of digits to an integer. Conversion from a representation +in decimal, octal, or hexadecimal notation was + treated above. The conversion the other way, +from an \gr{internal integer} to a printed representation, +has to be performed explicitly. +\TeX\ provides two conversion routines, +\cs{number} and \cs{romannumeral}. +The command \cs{number} is equivalent to \cs{the} +when followed by an internal integer. +These commands are performed in the expansion processor of \TeX, that is, +they are expanded whenever expansion has not been inhibited. + +Both commands +yield a string of tokens with category code~12; +their argument is a~\gr{number}. +Thus \verb-\romannumeral51-, \verb-\romannumeral\year-, +and~\verb-\number\linepenalty- are valid, and so is~\verb-\number13-. +Applying \cs{number} to a denotation has some uses: +it removes leading zeros and superfluous plus and minus signs. + +A roman numeral is a string of lowercase `roman digits', +which are characters of category code~12. +The sequence\howto Uppercase roman numberals\par +\begin{verbatim} +\uppercase\expandafter{\romannumeral ...} +\end{verbatim} +gives uppercase roman numerals. +This works because \TeX\ expands +tokens in order to find the opening brace of the argument +of \verb=\uppercase=. If \cs{romannumeral} is applied to +a negative number, the result is simply empty. + +%\point Integer registers +\section{Integer registers} + +Integers can be stored in \csidx{count} registers: +\begin{Disp}\cs{count}\gr{8-bit number}\end{Disp} +is an \gr{integer variable} and an \gr{internal integer}. +As an integer variable it can be used in a +\gr{variable assignment}: +\begin{Disp}\gr{variable assignment} $\longrightarrow$ + \gr{integer variable}\gr{equals}\gr{number} $|$ \dots\end{Disp} +\awp +As an internal integer it can be used as a \gr{number}: +\begin{Disp}\gr{number} $\rightarrow$ \gr{optional signs}\gr{internal integer} + $|$ \dots +\end{Disp} + +Synonyms for \cs{count} registers can be introduced by the +\csidx{countdef} command in a \gr{shorthand definition}: +\begin{Disp}\cs{countdef}\gr{control sequence}\gr{equals}\gr{8-bit number} +\end{Disp} A control sequence defined this way +is called a \gr{countdef token}, and it serves as an +\gr{internal integer}. + +The plain \TeX\ macro \csidx{newcount} +(which is declared \cs{outer}) uses the \cs{countdef} command +to allocate an unused \cs{count} register. +Counters 0--9 are scratch registers, like all +registers with numbers~0--9. +However, counters 0--9 are used for page identification +in the \n{dvi} file (see Chapter~\ref{TeXcomm}), +so they should be used as scratch +registers only inside a group. +Counters 10--22 are +used for plain \TeX's bookkeeping of allocation of registers. +Counter 255 is also scratch. + +%\point Arithmetic +\section{Arithmetic} + +The user can perform some arithmetic in \TeX, and +\term arithmetic\par +\TeX\ also performs arithmetic internally. User arithmetic +is concerned only with integers; the internal arithmetic +is mostly on fixed-point quantities, and only in the +case of glue setting on floating-point numbers. + +%\spoint Arithmetic statements +\subsection{Arithmetic statements} + +\TeX\ allows the user to +\cstoidx advance\par\cstoidx multiply\par\cstoidx divide\par +perform some arithmetic on integers. The statement +\begin{Disp}\cs{advance}\gr{integer variable}\gr{optional \n{by}}% + \gr{number}\end{Disp} +adds the value of the \gr{number} + \ldash which may be negative \rdash to the \gr{integer variable}. +Similarly, +\begin{Disp}\cs{multiply}\gr{integer variable}\gr{optional \n{by}}% + \gr{number}\end{Disp} +multiplies the value of the \gr{integer variable}, and +\begin{Disp}\cs{divide}\gr{integer variable}\gr{optional \n{by}}% + \gr{number}\end{Disp} +divides an \gr{integer variable}. + +Multiplication and division are also available for any so-called +\gr{numeric variable}: their most general form is +\begin{disp}\cs{multiply}\gr{numeric variable}\gr{optional \n{by}}\gr{number} +\end{disp} where +\begin{disp}\gr{numeric variable} $\longrightarrow$ +\gr{integer variable} $|$ \gr{dimen variable}\nl +\indent $|$ \gr{glue variable} $|$ \gr{muglue variable}\end{disp} + +The result of an arithmetic operation should not exceed +\awp +$2^{30}$ in absolute value. + +Division of integers yields an integer; that is, the remainder +is discarded. This raises the question of how rounding is performed +when either operand is negative. In such cases \TeX\ performs +the division with the absolute values of the operands, and +takes the negative of the result if exactly one operand was negative. + +%\spoint Floating-point arithmetic +\subsection{Floating-point arithmetic} + +Internally some arithmetic on floating-point quantities +\term arithmetic! floating-point\par +is performed, namely +in the calculation of glue set ratios. +%and slant for accents!! +However, machine-dependent aspects of rounding cannot +influence the decision process of \TeX, so machine independence +of \TeX\ is guaranteed in this respect (sufficient +accuracy of rounding is enforced by the \n{Trip} test of~\cite{K:trip}). + +%\spoint Fixed-point arithmetic +\subsection{Fixed-point arithmetic} + +All fractional arithmetic in \TeX\ is performed in fixed-point +\term arithmetic! fixed-point\par +arithmetic of `scaled integers': multiples of~$2^{-16}$. +This ensures the machine independence of \TeX. +Printed representations of scaled integers are rounded +to 5 decimal digits. + +In ordinary 32-bit implementations of \TeX\ the largest +integers are $2^{31}-1$ in absolute size. +The user is not allowed to specify +dimensions larger in absolute size than~$2^{30}-1$: two +such dimensions can be added or subtracted without +overflow on a 32-bit system. + +%\point Number testing +\section{Number testing} + +The most general test for integers in \TeX\ is +\begin{disp}\cs{ifnum}\gr{number$_1$}\gr{relation}\gr{number$_2$}\end{disp} +where \gr{relation} is a~\n<, \n>, or~\n= character, +all of category~12. + +Distinguishing between odd and even numbers is done +by \begin{disp}\cs{ifodd}\gr{number}\end{disp} + +A numeric case statement is provided by +\begin{disp}\cs{ifcase}\gr{number}\gr{case$_0$}\cs{or}\n{...}\cs{or}% + \gr{case$_n$}\cs{else}\gr{other cases}\cs{fi}\end{disp} +where the \cs{else}-part is optional. The tokens for \gr{case$_i$} +are processed if the number turns out to be~$i$; other cases are +skipped, similarly to what ordinarily happens in conditionals +(see Chapter~\ref{if}). + +%\point Remarks +\section{Remarks} + +%\spoint Character constants +\subsection{Character constants} + +In formats and macro collections numeric constants +are often needed. There are several ways to implement these +in \TeX. +\awp + +Firstly, +\begin{verbatim} +\newcount\SomeConstant \SomeConstant=42 +\end{verbatim} +This is wasteful, as it uses up a \cs{count} register. + +Secondly, +\begin{verbatim} +\def\SomeConstant{42} +\end{verbatim} +Better but accident prone: \TeX\ has to expand to find the number + \ldash which in itself is a slight overhead \rdash and may inadvertently +expand some tokens that should have been left alone. + +Thirdly, +\begin{verbatim} +\chardef\SomeConstant=42 +\end{verbatim} +This one is fine. +A \gr{chardef token} has the same status as a \cs{count} +register: both are \gr{internal integer}s. +Therefore a number defined this way can be used everywhere that +a \cs{count} register is feasible. +For large numbers the \cs{chardef} can be replaced by \cs{mathchardef}, +which runs to \verb>"7FFF>${}=32\,767$. +Note that a \gr{mathchardef token} can usually only appear +in math mode, but in the context of a number it can appear anywhere. + +%\spoint Expanding too far / how far +\subsection{Expanding too far / how far} + +It is a common mistake to write pieces of \TeX\ code +where \TeX\ will inadvertently expand something because it +is trying to compose a number. For example: +\begin{verbatim} +\def\par{\endgraf\penalty200} +...\par \number\pageno +\end{verbatim} +Here the page number will be absorbed into the value of the penalty. + +Now consider +\begin{verbatim} +\newcount\midpenalty \midpenalty=200 +\def\par{\endgraf\penalty\midpenalty} +...\par \number\pageno +\end{verbatim} +Here the page number is not scooped up by mistake: +\TeX\ is trying to locate a \gr{number} after the \cs{penalty}, +and it finds a \gr{countdef token}. This is {\em not\/} +converted to a representation in digits, so there is never any +danger of the page number being touched. + +It is possible to convert a \gr{countdef token} first to +a representation in digits before assigning it: +\begin{verbatim} +\penalty\number\midpenalty +\end{verbatim} +and this brings back again all previous problems of expansion. + + +%%%% end of input file [number] + +%\InputFile:glue +%%%% this is input file [glue] +%\subject[glue] Dimensions and Glue +\endofchapter +\chapter{Dimensions and Glue}\label{glue} + +In \TeX\ vertical and horizontal white space +can have a possibility to adjust itself through `stretching' or +\term glue\par +`shrinking'. An~adjustable white space is called `glue'. +This chapter treats all technical concepts related to +dimensions and glue, and it explains how the badness of stretching or shrinking +a certain amount is calculated. + + +\begin{inventory} +\item [\cs{dimen}] + Dimension register prefix. + +\item [\cs{dimendef}] + Define a control sequence to be a synonym for + a~\cs{dimen} register. + +\item [\cs{newdimen}] + Allocate an unused dimen register. + +\item [\cs{skip}] + Skip register prefix. + +\item [\cs{skipdef}] + Define a control sequence to be a synonym for + a~\cs{skip} register. + +\item [\cs{newskip}] + Allocate an unused skip register. + +\item [\cs{ifdim}] + Compare two dimensions. + +\item [\cs{hskip}] + Insert in horizontal mode a glue item. + +\item [\csidx{hfil}] + Equivalent to + \verb-\hskip 0cm plus 1fil-. + +\item [\csidx{hfilneg}] + Equivalent to + \verb-\hskip 0cm minus 1fil-. + +\item [\csidx{hfill}] + Equivalent to + \verb-\hskip 0cm plus 1fill-. + +\item [\csidx{hss}] + Equivalent to + \verb-\hskip 0cm plus 1fil minus 1fil-. + +\item [\cs{vskip}] + Insert in vertical mode a glue item. + +\item [\csidx{vfil}] + Equivalent to + \verb-\vskip 0cm plus 1fil-. + +\item [\csidx{vfill}] + Equivalent to + \verb-\vskip 0cm plus 1fill-. + +\item [\csidx{vfilneg}] + Equivalent to + \verb-\vskip 0cm minus 1fil-. + +\item [\csidx{vss}] + Equivalent to + \verb-\vskip 0cm plus 1fil minus 1fil-. + +\item [\cs{kern}] + Add a kern item to the current horizontal or vertical list. + +\item [\cs{lastkern}] + If the last item on the current list was a kern, the size of it. + +\item [\cs{lastskip}] + If the last item on the current list was a~glue, the size of it. + +\item [\cs{unkern}] + If the last item of the current list was a~kern, remove it. + +\item [\cs{unskip}] + If the last item of the current list was a~glue, remove it. + +\item [\cs{removelastskip}] + Macro to append the negative of the \cs{lastskip}. + +\item [\cs{advance}] + Arithmetic command to add to or subtract from + a~\gr{numeric variable}. + +\item [\cs{multiply}] + Arithmetic command to multiply a~\gr{numeric variable}. + +\item [\cs{divide}] + Arithmetic command to divide a~\gr{numeric variable}. + + +\end{inventory} + + + +%\point Definition of \gr{glue} and \gr{dimen} +\section{Definition of \gr{glue} and \gr{dimen}} + +This section gives +the syntax of the quantities +\gr{dimen} and \gr{glue}. +In the next section the practical aspects of glue are treated. + +Unfortunately the terminology for glue is slightly confusing. +The syntactical quantity~\gr{glue} is a dimension (a distance) with +\mdqon +possibly a stretch and/""or shrink component. +\mdqoff +In order to add a glob of `glue' (a white space) to a list one has to +let a \gr{glue} be preceded by commands such as \cs{vskip}. + + +%\spoint Definition of dimensions +\subsection{Definition of dimensions} + +A~\gr{dimen} is what \TeX\ expects to see when +it needs to indicate a dimension; it can be positive or negative. +\begin{disp}\gr{dimen} $\longrightarrow$ \gr{optional signs}% + \gr{unsigned dimen}\end{disp} +The unsigned part of a \gr{dimen} can be +\begin{disp}\gr{unsigned dimen} $\longrightarrow$ \gr{normal dimen} + $|$ \gr{coerced dimen}\nl + \gr{normal dimen} $\longrightarrow$ \gr{internal dimen} + $|$ \gr{factor}\gr{unit of measure}\nl + \gr{coerced dimen} $\longrightarrow$ \gr{internal glue} + \end{disp} +That is, we have the following three cases: +\begin{itemize} \item an \gr{internal dimen}; this is + any register or parameter of \TeX\ that has a \gr{dimen} value: + \begin{disp}\PopIndentLevel\gr{internal dimen} $\longrightarrow$ + \gr{dimen parameter}\nl + \indent $|$ \gr{special dimen} $|$ \cs{lastkern}\nl + \indent $|$ \gr{dimendef token} $|$ \cs{dimen}\gr{8-bit number}\nl + \indent $|$ \cs{fontdimen}\gr{number}\gr{font}\nl + \indent $|$ \gr{box dimension}\gr{8-bit number}\nl + \gr{dimen parameter} $\longrightarrow$ \cs{boxmaxdepth}\nl + \indent $|$ \cs{delimitershortfall} $|$ \cs{displayindent}\nl + \indent $|$ \cs{displaywidth} $|$ \cs{hangindent}\nl + \indent $|$ \cs{hfuzz} $|$ \cs{hoffset} $|$ \cs{hsize}\nl + \indent $|$ \cs{lineskiplimit} $|$ \cs{mathsurround}\nl + \indent $|$ \cs{maxdepth} $|$ \cs{nulldelimiterspace}\nl + \indent $|$ \cs{overfullrule} $|$ \cs{parindent}\nl + \indent $|$ \cs{predisplaysize} $|$ \cs{scriptspace}\nl + \indent $|$ \cs{splitmaxdepth} $|$ \cs{vfuzz}\nl + \indent $|$ \cs{voffset} $|$ \cs{vsize} + \end{disp} +\item a dimension denotation, + consisting of \gr{factor}\gr{unit of measure}, + for example \verb>0.7\vsize>; or +\item an \gr{internal glue} (see below) + coerced to a dimension by omitting + the stretch and shrink components, for example \cs{parfillskip}. +\end{itemize} + +A dimension denotation is a somewhat complicated entity: +\begin{itemize} \item a \gr{factor} is an integer denotation, + a decimal constant denotation (a number with an integral and + a fractional part), + or an \gr{internal integer} + \begin{disp}\PopIndentLevel + \gr{factor} $\longrightarrow$ \gr{normal integer} + $|$ \gr{decimal constant}\nl + \gr{normal integer} $\longrightarrow$ \gr{integer denotation}\nl + \indent $|$ \gr{internal integer}\nl + \gr{decimal constant} $\longrightarrow$ \n{.$_{12}$} + $|$ \n{,$_{12}$}\nl + \indent $|$ \gr{digit}\gr{decimal constant}\nl + \indent $|$ \gr{decimal constant}\gr{digit} + \end{disp} + An internal integer is a parameter that is `really' an +\alt + integer (for instance, \cs{count0}), and not coerced from a dimension or glue. + See Chapter~\ref{number} + for the definition of various kinds of integers. +\item a \gr{unit of measure} can be + a \gr{physical unit}, that is, an ordinary unit such as~\n{cm} + (possibly preceded by \n{true}), + an internal unit such as~\n{em}, but also an \gr{internal integer} + (by conversion to scaled points), + an \gr{internal dimen}, or an \gr{internal glue}. + \begin{disp}\PopIndentLevel + \gr{unit of measure} $\longrightarrow$ + \gr{optional spaces}\gr{internal unit}\nl + \indent $|$ + \gr{optional \n{true}}\gr{physical unit}\gr{one optional space}\nl + \gr{internal unit} $\longrightarrow$ + \n{em}\gr{one optional space}\nl + \indent $|$ \n{ex}\gr{one optional space} + $|$ \gr{internal integer}\nl + \indent $|$ \gr{internal dimen} $|$ \gr{internal glue} + \end{disp} +\end{itemize} + +Some \gr{dimen}s are called \gr{special dimen}s:\label{special:dimen:list} +\begin{disp}\gr{special dimen} $\longrightarrow$ \cs{prevdepth}\nl + \indent $|$ \cs{pagegoal} $|$ \cs{pagetotal} $|$ \cs{pagestretch}\nl + \indent $|$ \cs{pagefilstretch} $|$ \cs{pagefillstretch}\nl + \indent $|$ \cs{pagefilllstretch} $|$ \cs{pageshrink} $|$ \cs{pagedepth} + \end{disp} +An assignment to any of these is +called an \gr{intimate assignment}, and it is automatically +global (see Chapter~\ref{group}). The meaning of these +dimensions is explained in Chapter \ref{page:break}, with the +exception of \cs{prevdepth} which is treated in +Chapter~\ref{baseline}. + +%\spoint Definition of glue +\subsection{Definition of glue} + +A \gr{glue} is either some form of glue variable, or +a glue denotation with explicitly indicated stretch and +shrink. Specifically, +\begin{disp}\gr{glue} $\longrightarrow$ \gr{optional signs}\gr{internal glue} + $|$ \gr{dimen}\gr{stretch}\gr{shrink}\nl + \gr{internal glue} $\longrightarrow$ \gr{glue parameter} + $|$ \cs{lastskip}\nl + \indent $|$ \gr{skipdef token} $|$ \cs{skip}\gr{8-bit number}\nl + \gr{glue parameter} $\longrightarrow$ \cs{abovedisplayshortskip}\nl + \indent $|$ \cs{abovedisplayskip} $|$ \cs{baselineskip}\nl + \indent $|$ \cs{belowdisplayshortskip} $|$ \cs{belowdisplayskip}\nl + \indent $|$ \cs{leftskip} $|$ \cs{lineskip} $|$ \cs{parfillskip} + $|$ \cs{parskip}\nl + \indent $|$ \cs{rightskip} $|$ \cs{spaceskip} + $|$ \cs{splittopskip} $|$ \cs{tabskip}\nl + \indent $|$ \cs{topskip} $|$ \cs{xspaceskip} +\end{disp} +The stretch and shrink components in a glue denotation +are optional, but when both are specified they have to +be given in sequence; they are defined as +\begin{disp} +\gr{stretch} $\longrightarrow$ \n{plus} \gr{dimen} + $|$ \n{plus}\gr{fil dimen} $|$ \gr{optional spaces}\nl +\gr{shrink} $\longrightarrow$ \n{minus} \gr{dimen} + $|$ \n{minus}\gr{fil dimen} $|$ \gr{optional spaces}\nl +\gr{fil dimen} $\longrightarrow$ \gr{optional signs}\gr{factor}% + \gr{fil unit}\gr{optional spaces}\nl +\gr{fil unit} $\longrightarrow$ \n{ $|$ fil $|$ fill $|$ filll} +\end{disp} + +The actual definition of \gr{fil unit} is recursive +(see Chapter~\ref{gramm}), but these are the only valid +possibilities. + +%\spoint Conversion of \gr{glue} to \gr{dimen} +\subsection{Conversion of \gr{glue} to \gr{dimen}} + +The grammar rule +\begin{disp}\gr{dimen} $\longrightarrow$ + \gr{factor}\gr{unit of measure} +\end{disp} +has some noteworthy consequences, caused by the fact +that a \gr{unit of measure} need not look like a `unit of measure' +at all (see the list above). + +For instance, from this definition we conclude that the statement +\begin{verbatim} +\dimen0=\lastpenalty\lastpenalty +\end{verbatim} +is +syntactically correct because \cs{lastpenalty} can function +both as an integer and as \gr{unit of measure} by taking +its value in scaled points. +After \verb>\penalty8> the \cs{dimen0} thus defined will +have a size of~\n{64sp}. + +More importantly, consider the case where the \gr{unit of measure} is +an \gr{internal glue}, that is, any sort of glue parameter. +Prefixing such a glue with a number (the \gr{factor}) +makes it a valid \gr{dimen} specification. +Thus \begin{verbatim} +\skip0=\skip1 +\end{verbatim} +is very different +from \begin{verbatim} +\skip0=1\skip1 +\end{verbatim} +The first statement makes +\cs{skip0} equal to \cs{skip1}, the second converts +the \cs{skip1} to a \gr{dimen} before assigning it. +In other words, the \cs{skip0} defined by the second statement +has no stretch or shrink. + + +%\spoint Registers for \cs{dimen} and \cs{skip} +\subsection{Registers for \cs{dimen} and \cs{skip}} + +\TeX\ has registers for storing \gr{dimen} and \gr{glue} +values: the \csidx{dimen} and \csidx{skip} registers +respectively. These are accessible by the expressions +\begin{disp}\cs{dimen}\gr{number}\end{disp} and +\begin{disp}\cs{skip}\gr{number}\end{disp} +As with all registers of \TeX, these registers are +numbered~0--255. + +Synonyms for registers can be made with the \csidx{dimendef} and +\csidx{skipdef} commands. Their syntax is +\begin{Disp}\cs{dimendef}\gr{control sequence}\gr{equals}\gr{8-bit number} +\end{Disp} +and +\begin{Disp}\cs{skipdef}\gr{control sequence}\gr{equals}\gr{8-bit number}\end{Disp} +For example, after \verb-\skipdef\foo=13- using \cs{foo} +is equivalent to using \cs{skip13}. + +Macros \csidx{newdimen} and \csidx{newskip} exist in plain \TeX +for allocating an unused dimen or skip register. +These macros are defined to be \cs{outer} in the plain format. + +%\spoint Arithmetic: addition +\subsection{Arithmetic: addition} + +As for integer variables, arithmetic operations exist for +\cstoidx advance\par\term glue!arithmetic on\par\term arithmetic! on glue\par +dimen, glue, and muglue (mathematical glue; see page~\pageref{muglue}) +variables. + +The expressions +\begin{Disp}\cs{advance}\gr{dimen variable}\gr{optional \n{by}}% + \gr{dimen}\nl + \cs{advance}\gr{glue variable}\gr{optional \n{by}}% + \gr{glue}\nl + \cs{advance}\gr{muglue variable}\gr{optional \n{by}}% + \gr{muglue}\end{Disp} +add to the size of a dimen, glue, or muglue. + +Advancing a \gr{glue variable} by \gr{glue} is done by +adding the natural sizes, and the stretch and shrink components. +Because \TeX\ converts between \gr{glue} and \gr{dimen}, +it is possible to write for instance +\begin{verbatim} +\advance\skip1 by \dimen1 +\end{verbatim} +or +\begin{verbatim} +\advance\dimen1 by \skip1 +\end{verbatim} +In the first case \cs{dimen1} is coerced to \gr{glue} without +stretch or shrink; in the second case the \cs{skip1} is coerced +to a \gr{dimen} by taking its natural size. + +%\spoint Arithmetic: multiplication and division +\subsection{Arithmetic: multiplication and division} + +Multiplication and division operations exist for glue +\cstoidx multiply\par\cstoidx divide\par +and dimensions. One may for instance write +\begin{verbatim} +\multiply\skip1 by 2 +\end{verbatim} +which multiplies the natural size, and the stretch and shrink +components of \cs{skip1} by~2. + +The second operand of a \cs{multiply} or \cs{divide} +operation can only be a \gr{number}, that is, an integer. +Introducing the notion of \gr{numeric variable}: +\begin{disp}\gr{numeric variable} $\longrightarrow$ \gr{integer variable} + $|$ \gr{dimen variable} \nl + \indent $|$ \gr{glue variable} $|$ \gr{muglue variable}\end{disp} +these operations take the form +\begin{Disp}\cs{multiply}\gr{numeric variable}\gr{optional \n{by}}% +\gr{number}\end{Disp} +and +\begin{Disp}\cs{divide}\gr{numeric variable}\gr{optional \n{by}}% +\gr{number}\end{Disp} + +Glue and dimen can be multiplied by +non-integer quantities: +\begin{verbatim} +\skip1=2.5\skip2 +\dimen1=.78\dimen2 +\end{verbatim} +However, in the first line the \cs{skip2} is first coerced +to a \gr{dimen} value by omitting its stretch and shrink. + +%\point More about dimensions +\section{More about dimensions} + +%\spoint Units of measurement +\subsection{Units of measurement} + +In \TeX\ dimensions can be indicated in +\term units of measurement\par +\begin{description} \item [centimetre] + denoted \n{cm} or +\item [millimetre] + denoted \n{mm}; these are SI~units ({\italic Syst\`eme International + d'Unit\'es}, the + international system of standard units of measurements). +\item [inch] +\n{in}; more common in the Anglo-American world. +One inch is 2.54~centimetres. +\item [pica] + denoted \n{pc}; one pica is 12~points. +\item [point] + denoted \n{pt}; the common system +for Anglo-American printers. One inch is 72.27 points. +\item [didot point] + denoted \n{dd}; the common system for continental European printers. + Furthermore, 1157 didot points are 1238~points. +\item [cicero] + denoted \n{cc}; one cicero is 12~didot points. +\item [big point] + denoted \n{bp}; one inch is 72 big points. +\item [scaled point] + denoted \n{sp}; this is the smallest unit in \TeX, and all measurements + are integral multiples of one scaled point. + There are $65\,536$ scaled points in a~point. +\end{description} + +Decimal fractions can be written using both the +Anglo-American system with the decimal point +(for example, \n{1in}=\n{72.27pt}) +and the continental European system with a decimal +comma; \n{1in}=\n{72,27pt}. + +Internally \TeX\ works with multiples of a smallest +dimension: the scaled point. +Dimensions larger (in absolute value) than $2^{30}-1$\n{sp}, +which is about 5.75~metres or 18.9~feet, are illegal. + +Both the pica system and the didot system are of French +origin: in 1737 the type founder Pierre Simon Fournier +introduced typographical points based on the French foot. +Although at first he introduced a system based on lines and +points, he later took the point as unit: +there are 72 points in an inch, +which is one-twelfth of a foot. +About 1770 another founder, Fran\c{c}ois Ambroise Didot, introduced +points based on the more common, and slightly longer, +`pied du roi'. + +%\spoint Dimension testing +\subsection{Dimension testing} + +Dimensions and natural sizes of glue can be compared with +the \cs{ifdim} test. This takes the form +\begin{disp}\cs{ifdim}\gr{dimen$_1$}\gr{relation}\gr{dimen$_2$}\end{disp} +where the relation can be an \n>, \n<, or~\n= token, +all of category~12. + +%\spoint Defined dimensions +\subsection{Defined dimensions} + +\begin{inventory} +\item [\cs{z@}] + \n{0pt} + +\item [\cs{maxdimen}] + \n{16383.99999pt}; the largest legal dimension. +\end{inventory} + +These \gr{dimen}s are predefined in the plain format; +for instance \begin{verbatim} +\newdimen\z@ \z@=0pt +\end{verbatim} +Using such abbreviations for commonly used dimensions +has at least two advantages. First of all it saves main memory +if such a dimension occurs in a macro: a control sequence +is one token, whereas a string such as \n{0pt} takes three. +Secondly, it saves time in processing, as \TeX\ does not need +to perform conversions to arrive at the correct type of +object. + +Control sequences such as \cs{z@} +are only available to a user who changes the +category code of the `at' sign. Ordinarily, these control sequences +appear only in the macros defined in packages such as the +plain format. + +%\point More about glue +\section{More about glue} + +Glue items can be added to a vertical list with one of the +\alt +commands \csidx{vskip}\gr{glue}, \cs{vfil}, \cs{vfill}, \cs{vss} or +\cs{vfilneg}; +glue items can be added to a horizontal list with one of the +commands \csidx{hskip}\gr{glue}, \cs{hfil}, \cs{hfill}, \cs{hss} or +\cs{hfilneg}. We will now treat the properties of glue. + +%\spoint Stretch and shrink +\subsection{Stretch and shrink} + +In the syntax given above, \gr{glue} was defined as having +\term stretch\par\term shrink\par +\term glue!stretch component of\par\term glue!shrink component of\par +\begin{itemize}\item a `natural size', which is a \gr{dimen}, and optionally +\item a `stretch' and `shrink' component built out of a \gr{fil dimen}. +\end{itemize} + +Each list that \TeX\ builds has amounts of stretch and shrink +(possibly zero), +which are the sum of the +stretch and shrink components of individual pieces of glue in the list. +Stretch and shrink are used if the context in which the list +appears requires it to assume a size that is different from +its natural size. + +There is an important difference in behaviour between stretch +and shrink components when they are finite \ldash that is, +when the \gr{fildimen} is not \n{fil}(\n{l}(\n{l})). +A~finite amount of shrink is indeed the maximum shrink +that \TeX\ will take: the amount of glue specified +as \begin{verbatim} +5pt minus 3pt +\end{verbatim} +can shrink to \n{2pt}, but not further. +In contrast to this, a finite amount of stretch +can be stretched arbitrarily far. +Such arbitrary stretching +has a large `badness', however. +Badness calculation is treated below. + +\begin{example} +The sequence with natural size \n{20pt} +\begin{verbatim} +\hskip 10pt plus 2pt \hskip 10pt plus 3pt +\end{verbatim} +has \n{5pt} of stretch, but it has no shrink. In +\begin{verbatim} +\hskip 10pt minus 2pt \hskip 10pt plus 3pt +\end{verbatim} +there is \n{3pt} of stretch, and \n{2pt} of shrink, +so its minimal size is~\n{18pt}. + +Positive shrink is not the same as negative stretch: +\begin{verbatim} +\hskip 10pt plus -2pt \hskip 10pt plus 3pt +\end{verbatim} +looks a lot like the previous example, but it cannot +be shrunk as there are no \hbox{\n{minus}\gr{dimen}} +specifications. It does have \n{1pt} of stretch, however. + +This is another example of negative amounts of shrink and stretch. +It is not possible to stretch +glue (in the informal sense) by shrinking it (in the technical +sense): \begin{verbatim} +\hbox to 5cm{a\hskip 0cm minus -1fil} +\end{verbatim} +is an underfull box, because \TeX\ looks for a \n{plus}~\gr{dimen} +specification when it needs to stretch the contents. + +Finally, \begin{verbatim} +\hskip 10pt plus -3pt \hskip 10pt plus 3pt +\end{verbatim} +can neither stretch nor shrink. +The fact that there is only stretch +available means that the sequence cannot +shrink. However, the stretch components cancel out: the +total stretch is zero. Another way of looking at this +is to consider that for each point that the second glue item would +stretch, the first one would `stretch back' one point. +\end{example} + +Any amount of infinite stretch or shrink overpowers all +finite stretch or shrink available: +\begin{verbatim} +\hbox to 5cm{\hskip 0cm plus 16384pt + text\hskip 0cm plus 0.0001fil} +\end{verbatim} +has the \n{text} at the extreme left of the box. +There are three orders of `infinity', each one infinitely +stronger than the previous one: +\begin{verbatim} +\hbox to 5cm{\hskip 0cm plus 16384fil + text\hskip 0cm plus 0.0001fill} +\end{verbatim} +and +\begin{verbatim} +\hbox to 5cm{\hskip 0cm plus 16384fill + text\hskip 0cm plus 0.0001filll} +\end{verbatim} +both have the \n{text} at the left end of the box. + + + +%\spoint Glue setting +\subsection{Glue setting} + +In the process of `glue setting', the desired width (or height) +\term glue! setting\par +of a box is compared with the natural dimension of its contents, +which is the sum of all natural dimensions of boxes and globs of glue. +If the two differ, any available stretchability or shrinkability is used +to bridge the gap. +To attain the desired dimension of the box +only the glue of the highest available order is set: +each piece of glue of that order is stretched or shrunk by the +same ratio. + +For example, in +\begin{verbatim} +\hbox to 6pt{\hskip 0pt plus 3pt \hskip 0pt plus 9pt} +\end{verbatim} +the natural size of the box is~\n{0pt}, and +the total stretch is~\n{12pt}. In order to obtain a box +of~\n{6pt} each glue item is set with a stretch ratio +of~$1/2$. Thus the result is equivalent to +\begin{verbatim} +\hbox {\hskip 1.5pt \hskip 4.5pt} +\end{verbatim} +Only the highest order of stretch or shrink is used: +in \begin{verbatim} +\hbox to 6pt{\hskip 0pt plus 1fil \hskip 0pt plus 9pt} +\end{verbatim} +the second glue will assume its natural size of~\n{0pt}, +and only the first glue will be stretched. + +\TeX\ will never exceed the maximum value of a finite +amount of shrink. +A~box that cannot be shrunk enough is called `overfull'. +Finite stretchability can be exceeded to provide an +escape in difficult situations; however, \TeX\ is likely +to give an \verb-Underfull \hbox- message about this +(see page~\pageref{over/underfull}). +For an example of infinite shrink see page~\pageref{rlap}. + +%\spoint Badness +\subsection{Badness} + +When stretching or shrinking a list \TeX\ calculates +\term badness! calculation\par +badness based on the +ratio between actual stretch and the amount of stretch +present in the line. See Chapter~\ref{line:break} +for the application of badness to the paragraph algorithm. + +%\tracingmacros=2 \tracingcommands\tracingmacros +The formula for badness of a list that is stretched (shrunk) is +\label{bad:form}\message{Check roman min} +\begin{disp} $\displaystyle b=\hbox{min}\left(10\,000, +100\times \left({\hbox{actual amount stretched (shrunk)} +\over\hbox{possible amount of stretch (shrink)}}\right)^3\right)$\end{disp} +In reality \TeX\ uses a slightly different formula that is +easier to calculate, but behaves the same. Since glue setting is +one of the main activities of \TeX, this must be performed +as efficiently as possible. + +This formula lets the badness be a reasonably small number +if the glue set ratio (the fraction in the above expression) +is reasonably small, but will let it grow rapidly once +the ratio is more than~1. Badness is infinite if the +glue would have to shrink more than the allotted amount; +stretching glue beyond its maximum is possible, so this +provides an escape for very difficult lines of text or pages. + +In \TeX3, the \cs{badness} parameter records the badness +of the most recently formed box. + +%\spoint Glue and breaking +\subsection{Glue and breaking} + +\TeX\ can break lines and pages in several kinds of places. +One of these places is before a glue item. +The glue is then discarded. For line breaks this is treated +in Chapter~\ref{line:break}, +for page breaks see Chapter~\ref{page:break}. + +There are two macros in plain \TeX, \csidx{hglue} and \csidx{vglue}, +that give non-disappearing glue in horizontal and +vertical mode respectively. For the horizontal case this is +accomplished by +placing: +\begin{verbatim} +\vrule width 0pt \nobreak \hskip ... +\end{verbatim} +Because \TeX\ breaks at the front end of glue, +this glue will always stay attached to the rule, +and will therefore never disappear. +The actual macro definitions are somewhat more complicated, +because they take care to preserve the \cs{spacefactor} and the +\cs{prevdepth}. + +%\spoint \cs{kern} +\subsection{\cs{kern}} + +The \csidx{kern} command specifies +a~kern item in whatever mode \TeX\ is currently +in. A~kern item is much like a glue item without +stretch or shrink. +It differs from glue in that it is +in general not a legal breakpoint. Thus in +\begin{verbatim} +.. text .. \hbox{a}\kern0pt\hbox{b} +\end{verbatim} +\TeX\ will not break lines in between the boxes; in +\begin{verbatim} +.. text .. \hbox{a}\hskip0pt\hbox{b} +\end{verbatim} +a line can be broken in between the boxes. + +However, if a kern is followed by glue, \TeX\ can break at the +kern (provided that it is not in math mode). +In horizontal mode +both the kern and the glue then disappear in the break. +In vertical mode they are discarded when they are moved to +the (empty) current page after the material before +the break has been disposed of by the output routine +(see Chapter~\ref{page:break}). + +%\spoint Glue and modes +\subsection{Glue and modes} + +All horizontal skip commands are \gr{horizontal command}s and +all vertical skip commands are \gr{vertical commands}s. +This means that, for instance, an \cs{hskip} command +makes \TeX\ start a paragraph if it is given in vertical mode. +The \cs{kern} command can be given in both modes. + +%\spoint The last glue item in a list: backspacing +\subsection{The last glue item in a list: backspacing} + +The last glue item in a list can be measured, and +it can be removed in all modes but external vertical mode. +The internal variables +\csidx{lastskip} and \csidx{lastkern} can be used +to measure the last glob of glue in all modes; +if the last glue was not a skip or kern respectively +they give~\n{0pt}. +In math mode the \cs{lastskip} +functions as \gr{internal muglue}, but in general +it classifies as \gr{internal glue}. +The \cs{lastskip} and \cs{lastkern} +are also \n{0pt} if that was the size of the last glue or +kern item on the list. + +The operations\label{unskip} +\csidx{unskip} and \csidx{unkern} remove the last item of a list, +if this is a glue or kern respectively. They have no effect +in external vertical mode; in that case the +best substitute is +\verb=\vskip-\lastskip= +and~\verb=\kern-\lastkern=. + +In the process of paragraph building \TeX\ itself performs +an important \cs{unskip}: a~paragraph ending with a +white line will have a space token inserted by \TeX's input processor. +This is removed by an \cs{unskip} before the \cs{parfillskip} glue +(see Chapter~\ref{par:end}) is inserted. + +Glue is treated by \TeX\ as a special case of leaders, +which becomes apparent when \cs{unskip} is applied to +leaders: they are removed. + +%\spoint Examples of backspacing +\subsection{Examples of backspacing} + +The plain \TeX\ macro \csidx{removelastskip} is defined +as \begin{verbatim} +\ifdim\lastskip=0pt \else \vskip-\lastskip \fi +\end{verbatim} +If the last item on the list was a glue, this macro will +backspace by its value, provided its natural size was not zero. +In all other cases, nothing is added to the list. + +Sometimes an intelligent version of commands such as \cs{vskip} +is necessary, in the sense that two subsequent skip commands +should result only in the larger of the two glue amounts. +On page~\pageref{skip:scheme} such a macro is used: +\begin{verbatim} +\newskip\tempskipa +\def\vspace#1{\tempskipa=#1\relax + \ifvmode \ifdim\tempskipa<\lastskip + \else \vskip-\lastskip \vskip\tempskipa + \fi + \else \vskip\tempskipa \fi} +\end{verbatim} +First of all, this tests whether the mode is vertical; +if not, the argument can safely be placed. +Copying the argument into a skip register is necessary +because \cs{v\-space}\verb>{2pt plus 3pt}> would lead to +problems in an \verb>\ifdim#1<\lastskip> test. + +If the surrounding mode was vertical, the argument +should only be placed if it is not less than what is +already there. The macro would be incorrect +if the test read +\begin{verbatim} + \ifdim\tempskipa>\lastskip + \vskip-\lastskip \vskip\tempskipa + \fi +\end{verbatim} +In this case the sequence +\begin{verbatim} +... last word.\par \vspace{0pt plus 1fil} +\end{verbatim} +would not place any glue, because after +the \cs{par} we are in vertical mode and +\cs{lastskip} has a value of \n{0pt}. + +%\spoint Glue in trace output +\subsection{Glue in trace output} + +If the workings of \TeX\ are traced by setting +\cs{tracingoutput} positive, or if \TeX\ +writes a box to the log file +(because of a \cs{showbox} command, or because it +is overfull or underfull), +glue is denoted by the control sequence \cs{glue}. +This is not a \TeX\ command; it merely indicates the presence +of glue in the current list. + +The box representation that \TeX\ generated from, +\alt +for instance, \cs{showbox} +inserts a space after every explicit \cs{kern}, +but no space is inserted after an implicit +kern that was inserted by the kerning information in the font +\n{tfm} file. Thus \hbox{\verb-\kern 2.0pt-} denotes a kern +that was inserted by the user or by a macro, and +\verb-\kern2.0pt- denotes an implicit kern. + +Glue that is inserted automatically (\cs{topskip}, \cs{baselineskip}, +et cetera) is denoted by name in \TeX's trace output. +For example, the box +\begin{verbatim} +\vbox{\hbox{Vo}\hbox{b}} +\end{verbatim} +looks like +\begin{verbatim} +\vbox(18.83331+0.0)x11.66669 +.\hbox(6.83331+0.0)x11.66669 +..\tenrm V +..\kern-0.83334 +..\tenrm o +.\glue(\baselineskip) 5.05556 +.\hbox(6.94444+0.0)x5.55557 +..\tenrm b +\end{verbatim} +Note the implicit kern inserted between `V' and~`o'. + +%%%% end of input file [glue] + +%\InputFile:rules +%%%% this is input file [rules] +%\subject[rules] Rules and Leaders +\endofchapter +\chapter{Rules and Leaders}\label{rules} + +Rules and leaders are two ways of getting \TeX\ to draw a line. +Leaders are more general than rules: they can also fill +available space with copies of a certain box. This chapter +explain how rules and leaders work, and how they interact with modes. + + +\begin{inventory} +\item [\cs{hrule}] + Rule that spreads in horizontal direction. + +\item [\cs{vrule}] + Rule that spreads in vertical direction. + +\item [\cs{leaders}] + Fill a specified amount of space with a rule or copies of box. + +\item [\cs{cleaders}] + Like \verb=\leaders=, but with box leaders + any excess space is split equally before and after the leaders. + +\item [\cs{xleaders}] + Like \verb=\leaders=, but with box leaders any excess space is + spread equally before, after, and between the boxes. + +\end{inventory} + +%\point Rules +\section{Rules} + +\TeX's rule commands give +\term rules\par +rectangular black patches with horizontal and vertical sides. +Most of the times, a rule command will give output that +looks like a rule, but~\hbox{\vrule height 1.5ex width 1.5ex} +can also be produced by a rule. + +\TeX\ has both horizontal and vertical rules, +but the names do not necessarily imply anything about the shape. +They do, however, imply something about modes: +an \csidx{hrule} command can only be used in vertical mode, +and a \csidx{vrule} only in horizontal mode. +In fact, an \cs{hrule} is a \gr{vertical command}, and a \cs{vrule} +is a \gr{horizontal command}, so \TeX\ may change +modes when encountering these commands. + +Why then is a \cs{vrule} called a {\em vertical\/} rule? +The reason is that a \cs{vrule} can expand arbitrarily +far in the vertical direction: if its height and depth are not +specified explicitly it will take as much room as its +surroundings allow\altt. + +\begin{example} +\begin{verbatim} +\hbox{\vrule\ text \vrule} +\end{verbatim} +looks like \begin{disp}\leavevmode\hbox{\vrule\ text \vrule}\end{disp} +and \begin{verbatim} +\hbox{\vrule\ A gogo! \vrule} +\end{verbatim} +looks like +\begin{disp}\leavevmode\hbox{\vrule\ A gogo! \vrule}\end{disp} +\end{example} + +For the \cs{hrule} command a similar statement is true: +a horizontal rule can spread to assume the width of +its surroundings. Thus +\begin{verbatim} +\vbox{\hbox{One line of text}\hrule} +\end{verbatim} +looks like +\begin{disp}\leavevmode\vtop{\hbox{One line of text}\hrule}\end{disp} + + +%\spoint Rule dimensions +\subsection{Rule dimensions} + +Horizontal and vertical rules have a default thickness: +\begin{Disp} \cs{hrule}\quad is the same as\quad \verb-\hrule height.4pt depth0pt- +\end{Disp} +and +\begin{Disp} \cs{vrule}\quad is the same as\quad \verb-\vrule width.4pt- \end{Disp} +and if the remaining dimension remains unspecified, the rule +extends in that direction to fill the enclosing box. + +Here is the formal specification of how to indicate rule sizes: +\begin{disp}\gr{vertical rule} $\longrightarrow$ + \cs{vrule}\gr{rule specification}\nl + \gr{horizontal rule} $\longrightarrow$ + \cs{hrule}\gr{rule specification}\nl + \gr{rule specification} $\longrightarrow$ + \gr{optional spaces} \nl \indent$|$ + \gr{rule dimensions}\gr{rule specification}\nl + \gr{rule dimension} $\longrightarrow$ + \n{width}\gr{dimen} $|$ \n{height}\gr{dimen} $|$ + \n{depth}\gr{dimen} + \end{disp} +If a rule dimension is specified twice, the second instance +takes precedence over the first. This makes it possible +to override the default dimensions. For instance, +after +\alt +\howto Change the default dimensions of rules\par +\begin{verbatim} +\let\xhrule\hrule \def\hrule{\xhrule height .8pt} +\end{verbatim} +the macro \cs{hrule} gives a horizontal rule +of double the original height, and it is still possible +with \begin{verbatim} +\hrule height 2pt +\end{verbatim} +to specify other heights. + +It is possible to specify all three dimensions; then +\begin{verbatim} +\vrule height1ex depth0pt width1ex +\end{verbatim} +and +\begin{verbatim} +\hrule height1ex depth0pt width1ex +\end{verbatim} +look the same. +Still, each of them can be used only in the appropriate mode. + +%\point Leaders +\section{Leaders} + +Rules are intimately connected to modes, which makes it easy +\term leaders\par +to obtain some effects. For instance, a typical application +of a vertical rule looks like +\begin{verbatim} +\hbox{\vrule width1pt\ Important text! \vrule width 1pt} +\end{verbatim} +which gives +\begin{disp}\leavevmode\hbox{\vrule width 1pt\ Important text! + \vrule width 1pt}\end{disp} +However, one might want to have a horizontal rule +in horizontal mode for effects such as +\begin{disp}\leavevmode +\vbox{\hbox to 5cm{$\longleftarrow$\hfil 5cm\hfil$\longrightarrow$} + \hbox to 5cm{from here\leaders\hrule\hfil to there}}\end{disp} +An \cs{hrule} can not be used in horizontal mode, and +a vertical rule will not spread automatically. + +However, there is a way to use an \cs{hrule} command in +horizontal mode and a \cs{vrule} in vertical mode, +and that is with `leaders', so called because +they lead your eye across the page. +A~leader command tells \TeX\ +to fill a~specified space, in whatever mode it is in, +with as many copies of some box or rule specification +as are needed. For instance, the above example +was given as +\begin{disp}\verb>\hbox to 5cm{from here\leaders\hrule\hfil to there}>\end{disp} +that is, with an \cs{hrule} that was allowed to stretch along +an \cs{hfil}. +Note that the leader was given a horizontal skip, +corresponding to the horizontal mode in which it appeared. + +A general leader command looks like +\begin{Disp} \gr{leaders}\gr{box or rule}% + \gr{vertical/horizontal/mathematical skip}\end{Disp} +where \gr{leaders} is \cs{leaders}, \cs{cleaders}, +or~\cs{xleaders}, a \gr{box~or~rule} +is a~\gr{box}, \cs{vrule}, or~\cs{hrule}, and the +lists of horizontal and vertical skips appear in Chapter~\ref{hvmode}; +a~mathematical skip is either a horizontal skip or an~\cs{mskip} +(see page~\pageref{muglue}). +Leaders can thus be used in all three modes. Of course, the +appropriate kind of skip must be specified. + +A horizontal (vertical) box containing leaders has at least +the height and depth (width) of the \gr{box~or~rule} used +in the leaders, even if, as can happen in the case of box leaders, +no actual leaders are placed. + +%\spoint Rule leaders +\subsection{Rule leaders} + +Rule leaders fill the specified amount of space with a rule +\term leaders !rule\par\cstoidx leaders\par +extending in the direction of the skip specified. +The other dimensions of the resulting rule leader +are determined by the sort of rule that is used: +either dimensions can be specified explicitly, or +the default values can be used. + +For instance, +\begin{verbatim} +\hbox{g\leaders\hrule\hskip20pt f} +\end{verbatim} +gives \begin{disp}\leavevmode\hbox{g\leaders\hrule\hskip20pt f}\end{disp} +because a horizontal rule has a default height of~\n{.4pt}. +On the other hand, +\begin{verbatim} +\hbox{g\leaders\vrule\hskip20pt f} +\end{verbatim} +gives \begin{disp}\leavevmode\hbox{g\leaders\vrule\hskip20pt f}\end{disp} +because the height and depth of a vertical rule +by default fill the surrounding box. + +Spurious rule dimensions are ignored: in horizontal mode +\begin{verbatim} +\leaders\hrule width 10pt \hskip 20pt +\end{verbatim} +is equivalent to +\begin{verbatim} +\leaders\hrule \hskip 20pt +\end{verbatim} + +If the width or height-plus-depth +of either the skip or the box is negative, +\TeX\ uses ordinary glue instead of leaders. + +%\spoint Box leaders +\subsection{Box leaders} + +Box leaders fill the available spaces with copies of +a given box, instead of with a rule. + +\newbox\centerdot \setbox\centerdot=\hbox{\hskip.7em.\hskip.7em} + +For all of the following examples, assume that a box register +has been allocated: +\begin{verbatim} +\newbox\centerdot \setbox\centerdot=\hbox{\hskip.7em.\hskip.7em} +\end{verbatim} +Now the output of +\begin{verbatim} +\hbox to 8cm {here\leaders\copy\centerdot\hfil there} +\end{verbatim} +is +\begin{disp}\leavevmode\hbox to 8cm {here\leaders\copy\centerdot\hfil there} +\end{disp} That is, copies of the box register fill up the +available space. + +Dot leaders, as in the above example, are often used for +tables of contents. In such applications it is desirable that +dots on subsequent lines are vertically aligned. +The \cs{leaders} command does this automatically: +\begin{verbatim} +\hbox to 8cm {here\leaders\copy\centerdot\hfil there} +\hbox to 8cm {over here\leaders\copy\centerdot\hfil over there} +\end{verbatim} +gives \begin{disp}\leavevmode +\vtop{\hbox to 8cm {here\leaders\copy\centerdot\hfil there} +\hbox to 8cm {over here\leaders\copy\centerdot\hfil over there\strut}} +\end{disp} +The mechanism behind this is the following: +\TeX\ acts as if an infinite row of boxes starts (invisibly) at +the left edge of the surrounding box, +and the row of copies actually placed is +merely the part of this row that is not obscured by +the other contents of the box. + +Stated differently, box leaders are a window on an infinite +row of boxes, and the row starts at the left edge of the +surrounding box. Consider the following example: +\begin{verbatim} +\hbox to 8cm {\leaders\copy\centerdot\hfil} +\hbox to 8cm {word\leaders\copy\centerdot\hfil} +\end{verbatim} +which gives +\begin{disp}\leavevmode\vtop{\hbox to 8cm {\leaders\copy\centerdot\hfil} +\hbox to 8cm {word\leaders\copy\centerdot\hfil\strut}}\end{disp} +The row of leaders boxes becomes visible as soon as it +does not coincide with other material. + +The above discussion only talked about leaders in horizontal +mode. Leaders can equally well be placed in vertical mode; +for box leaders the `infinite row' then starts at the top +of the surrounding box. + +%\spoint Evenly spaced leaders +\subsection{Evenly spaced leaders} + +Aligning subsequent box leaders in the way described above +means that the white space before and after the +leaders will in general be different. +If vertical alignment is not +an issue it may be aesthetically more pleasing to have +the leaders evenly spaced. +The \csidx{cleaders} command is like \cs{leaders}, +except that it splits excess space before and after the leaders +into two equal parts, centring the row of boxes in the +available space. + +\begin{example}\message{check verbatim indentation} +\begin{verbatim} +\hbox to 7.8cm {here\cleaders\copy\centerdot\hfil there} +\hbox to 7.8cm {here is\cleaders\copy\centerdot\hfil there} +\end{verbatim} +gives \begin{disp}\leavevmode\vbox{ +\hbox to 7.8cm {here\cleaders\copy\centerdot\hfil there} +\hbox to 7.8cm {here is\cleaders\copy\centerdot\hfil there\strut} +}\end{disp} +The `expanding leaders' \csidx{xleaders} spread excess space evenly +between the boxes, with equal globs of glue before, after, +and in between leader boxes. +\end{example} + +\begin{example} \begin{verbatim} +\hbox to 7.8cm{here\hskip.7em + \xleaders\copy\centerdot\hfil \hskip.7em there} +\end{verbatim} +gives \begin{disp}\leavevmode +\hbox to 7.8cm {here\hskip.7em\xleaders\copy\centerdot\hfil\hskip.7em there} +\end{disp} Note that the glue in the leader box is balanced here +with explicit glue before and after the leaders; +leaving out these glue items, as in\begin{verbatim} +\hbox to 7.8cm {here\xleaders\copy\centerdot\hfil there} +\end{verbatim} +gives \begin{disp}\leavevmode +\hbox to 7.8cm {here\xleaders\copy\centerdot\hfil there} +\end{disp} +which is clearly not what was intended. +\end{example} + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Rules and modes +\subsection{Rules and modes} + +Above it was explained how rules can only occur in the +appropriate modes. Rules also influence mode-specific +quantities: +no baselineskip is added before rules in +vertical mode. In order to prevent glue after rules, +\TeX\ sets \cs{prevdepth} to +\n{\hbox{-}1000pt} +(see Chapter~\ref{baseline}). +Similarly the \cs{spacefactor} is set to 1000 after a \cs{vrule} +in horizontal mode (see Chapter~\ref{line:break}). + + +%\spoint[par:leaders:end] Ending a paragraph with leaders +\subsection{Ending a paragraph with leaders} +\label{par:leaders:end} + +An attempt to simulate an \cs{hrule} at the end of a paragraph by +\howto End a paragraph with leaders\par +\begin{verbatim} +\nobreak\leaders\hrule\hfill\par +\end{verbatim} +does not work. The reason for this is that \TeX\ +performs an \cs{unskip} at the end of a paragraph, +which removes the leaders. Normally this \cs{unskip} removes +any space token inserted by the input processor after the +last line. Remedy: stick an \verb.\hbox{}. at the end of +the leaders. + +%\spoint Leaders and box registers +\subsection{Leaders and box registers} + +In the above examples the leader box was inserted with +\cs{copy}. The output of +\begin{verbatim} +\hbox to 8cm {here\leaders\box\centerdot\hfil there} +\hbox to 8cm {over here\leaders\box\centerdot\hfil + over there} +\end{verbatim} +is +\begin{disp}\leavevmode + \vtop{\hbox to 8cm {here\leaders\box\centerdot\hfil there} + \hbox to 8cm {over here\leaders\box\centerdot\hfil over there} + }\end{disp} +The box register is emptied after the first leader command, +but more than one copy is placed in that first command. + +%\spoint Output in leader boxes +\subsection{Output in leader boxes} + +Any \cs{write}, \cs{openout}, or \cs{closeout} operation +appearing in leader boxes is ignored. +Otherwise such an operation would be executed once for every +copy of the box that would be shipped out. + +%\spoint Box leaders in trace output +\subsection{Box leaders in trace output} + +The dumped box representation obtained from, +for instance, \cs{tracingoutput} +does not write out box leaders in full: only the total size and +one copy of the box used are dumped. In particular, +the surrounding white space before and after the leaders +is not indicated. + +%\spoint Leaders and shifted margins +\subsection{Leaders and shifted margins} + +If margins have been shifted, +leaders may look different +depending on how the shift has been realized. +For an illustration of how \cs{hangindent} and \cs{leftskip} +influence the look of leaders, consider the following +examples, where +\begin{verbatim} +\setbox0=\hbox{K o } +\end{verbatim} +The horizontal boxes above the leaders +\altt +serve to indicate the starting point of the row of leaders. + +First +\begin{verbatim} +\hbox{\leaders\copy0\hskip5cm} +\noindent\advance\leftskip 1em + \leaders\copy0\hskip5cm\hbox{}\par +\end{verbatim} +gives\message{examples on} +\begin{disp}\leavevmode\vbox{\leftskip=0pt \hsize=7cm +\setbox0=\hbox{K o } +\hbox{\leaders\copy0\hskip5cm} +\noindent\advance\leftskip 1em + \leaders\copy0\hskip5cm\hbox{}\par + }\end{disp} +Then +\begin{verbatim} +\hbox{\kern1em\hbox{\leaders\copy0\hskip5cm}} +\hangindent=1em \hangafter=-1 \noindent + \leaders\copy0\hskip5cm\hbox{}\par +\end{verbatim} +gives (note the shift with respect to the previous example) +\begin{disp}\leavevmode\vbox{\leftskip=0pt \hsize=7cm +\setbox0=\hbox{K o } +\hbox{\kern1em\hbox{\leaders\copy0\hskip5cm}} +\hangindent=1em \hangafter=-1 \noindent + \leaders\copy0\hskip5cm\hbox{}\par}\end{disp} +\message{one page} +In the first paragraph the \cs{leftskip} glue only obscures +the first leader box; in the second paragraph the hanging +indentation actually shifts the orientation point for the +row of leaders. Hanging indentation is performed in \TeX\ +by a \cs{moveright} of the boxes containing the lines +of the paragraph. + +%%%% end of input file [rules] + +%\InputFile:group +%%%% this is input file [group] +%\subject[group] Grouping +\endofchapter +\chapter{Grouping}\label{group} + +\TeX\ has a grouping mechanism that is able to confine most +changes to a~particular locality. This chapter explains +what sort of actions can be local, and how groups are formed. + + +\begin{inventory} +\item [\cs{bgroup}] +Implicit beginning of group character. +\item [\cs{egroup}] +Implicit end of group character. +\item [\cs{begingroup}] +Open a group that must be closed with \cs{endgroup}. +\item [\cs{endgroup}] +Close a group that was opened with \cs{begingroup}. +\item [\cs{aftergroup}] +Save the next token for insertion after the current group ends. +\item [\cs{global}] +Make assignments, macro definitions, and arithmetic global. +\item [\cs{globaldefs}] +Parameter for overriding \cs{global} prefixes. +\IniTeX\ default:~0. +\end{inventory} + +%\point The grouping mechanism +\section{The grouping mechanism} + +A group is a sequence of tokens starting with a +\term grouping\par +`beginning of group' token, +and ending with an `end of group' +token, and in which all such tokens are properly balanced. + +The grouping mechanism of \TeX\ is not the same as +the block structure +of ordinary programming languages. +Most languages with block structure are only able to have +local definitions. \TeX's grouping mechanism is stronger: +most assignments made inside a group +are local to that group unless explicitly indicated otherwise, +and outside the group old values are restored. + +An example of local definitions +\begin{verbatim} +{\def\a{b}}\a +\end{verbatim} +gives an `undefined control sequence' +message because \cs{a} is only defined inside the group. +Similarly, the code +\begin{verbatim} +\count0=1 {\count0=2 } \showthe\count0 +\end{verbatim} +will display the value~1; the assignment made inside the group +is undone at the end of the group. + + +Bookkeeping of values that are to be restored outside the group +is done through the mechanism +\term save stack\par +of the `save stack'. Overflow of the save stack is treated +in Chapter~\ref{error}. The save stack is also used for +a few other purposes: in calls such as \hbox{\verb>\hbox to 100pt{...}>} +the specification \hbox{\n{to 100pt}} is put on the save +stack before a new level of grouping is opened. + +In order to prevent a lot of trouble with the save stack, +\IniTeX\ does not allow dumping a format inside a group. +The \cs{end} command is allowed to occur inside a group, +but \TeX\ will give a diagnostic message about this. + +The \cs{aftergroup} control sequence saves a token for +insertion after the current group. Several tokens can be +set aside by this command, and they are inserted in the left-to-right +order in which they were stated. +This is treated in Chapter~\ref{expand}. + + +%\point[global:assign] Local and global assignments +\section{Local and global assignments} +\label{global:assign} + +An assignment or macro definition +is usually made global by prefixing it with \csidx{global}, +\term statements !local\par\term statements !global\par +\term local statements\par\term global statements\par +but non-zero values of the \gr{integer parameter} +\csidx{globaldefs} override \cs{global} +specifications: if \cs{globaldefs} is positive every assignment +is implicitly prefixed with \cs{global}, and if +\cs{globaldefs} is negative, \cs{global} is +ignored. Ordinarily this parameter is zero. + +Some assignment are always global: the \gr{global assignment}s are +\begin{description}%\FlushRight:no +\item [\gr{font assignment}] +assignments involving \cs{fontdimen}, \cs{hyphenchar}, +and \cs{skew\-char}. +\item [\gr{hyphenation assignment}] +\cs{hyphenation} and \cs{patterns} commands +(see Chapter~\ref{line:break}). +\item [\gr{box size assignment}] +altering box dimensions with \cs{ht}, \cs{dp}, and~\cs{wd} +(see Chapter~\ref{boxes}). +\item [\gr{interaction mode assignment}] +run modes for a \TeX\ job (see Chapter~\ref{run}). +\item [\gr{intimate assignment}] +assignments to a \gr{special integer} or \gr{special dimen}; +see %Chapters \ref{number} and~\ref{glue}. +pages \pageref{special:int:list} and~\pageref{special:dimen:list}. +\end{description} + +%\point Group delimiters +\section{Group delimiters} + +A group can be delimited by character tokens of category code~1 +\term delimiter! group\par +for `beginning of group' and code~2 for `end of group', or +control sequence tokens that are \cs{let} to such characters, +the \cs{bgroup} and \cs{egroup} in plain \TeX. +Implicit and explicit braces can match to delimit +a group. + +Groups can also be delimited by \csidx{begingroup} and +\csidx{endgroup}. These two control sequences must +be used together: they cannot be matched with implicit +or explicit braces, nor can they function as the braces +surrounding, for instance, boxed material. + +Delimiting with \cs{begingroup} and \cs{endgroup} can +\label{begin:end:macros}% +provide a limited form of run-time error checking. +In between these two group delimiters an excess +open or close brace would result in +\begin{verbatim} +\begingroup ... } ... \endgroup +\end{verbatim} +or +\begin{verbatim} +\begingroup ... { ... \endgroup +\end{verbatim} +In both cases \TeX\ gives an error message about improper +balancing. Using \cs{bgroup} and \cs{egroup} here would +make an error much harder to find, because of the incorrect +matching that would occur. This idea is used in the environment +macros of several formats. + +The choice of the brace characters for the beginning and end of group +characters is not hard-wired in \TeX. It is arranged +\cstoidx bgroup\par\cstoidx egroup\par +like this in the plain format: +\begin{verbatim} +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\end{verbatim} +Implicit braces have also been defined in the plain format: +\begin{verbatim} +\let\bgroup={ \let\egroup=} +\end{verbatim} + +Special cases are the following: +\begin{itemize} \item The replacement text of a macro must be enclosed +in explicit beginning and end of group character tokens. +\item The open and close braces for boxes, \cs{vadjust}, +and \cs{insert} can be implicit. This makes it possible +to define, for instance +\begin{verbatim} +\def\openbox#1{\setbox#1=\hbox\bgroup} +\def\closebox#1{\egroup\box#1} +\openbox{15}Foo bar\closebox{15} +\end{verbatim} +\item The right-hand side of a token list assignment and the +argument of the commands \cs{write}, \cs{message}, \cs{errmessage}, +\cs{uppercase}, \cs{lowercase}, +\cs{special}, and \cs{mark} is a \gr{general text}, defined +as +\begin{Disp} \gr{general text} $\longrightarrow$ \gr{filler}\lb + \gr{balanced text}\gr{right brace}\end{Disp} +meaning that the left brace can be implicit, but the closing +right brace must be an explicit character token with category +code~2. \end{itemize} + +In cases where an implicit left brace suffices, and where +expansion is not explicitly inhibited, \TeX\ will +expand tokens until a left brace is encountered. This +is the basis for such constructs as +\verb=\uppercase\expandafter{\romannumeral80}=, +which in this unexpanded form do not adhere to the +syntax. If the first unexpandable token is not a left +brace \TeX\ gives an error message. + +The grammar of \TeX\ (see Chapter~\ref{gramm}) uses +\gr{left brace} and \gr{right brace} for explicit +characters, that is, character tokens, +and \n{\lb} and~\n{\rb} +for possibly implicit characters, +\altt +that is, control sequences that have been \cs{let} to such +explicit characters. + +%\point More about braces +\section{More about braces} + + +%\spoint Brace counters +\subsection{Brace counters} + +\TeX\ has two counters for keeping track of grouping levels: +\term braces\par +the {\it master counter} and the {\it balance counter}. +Both of these counters are syntactic counters: they count the +explicit brace character tokens, but are not affected by implicit +braces (such as \cs{bgroup}) that are semantically equivalent +to an explicit brace. + +The balance counter handles braces in all cases except in +alignment. Its workings are intuitively clear: it goes up +by one for every opening and down for every closing +brace that is not being skipped. Thus +\begin{verbatim} +\iffalse{\fi +\end{verbatim} +increases the balance counter if +this statement is merely scanned (for instance if it +appears in a macro definition text); if this statement +is executed the brace is skipped, so there is no effect on +the balance counter. + +The master counter is more tricky; +it is used in alignments instead of the balance counter. +This counter records all braces, even when they are skipped +such as in \verb>\iffalse{\fi>. +For this counter uncounted skipped braces are still possible: +the alphabetic constants \n{`\lb} and \n{`\rb} have +no effect on this counter when they are +use by the execution processor as a~\gr{number}; +they do affect this counter when they are seen by the +input processor (which merely sees characters, and not +the context). + +%\spoint The brace as a token +\subsection{The brace as a token} + +Explicit braces are character tokens, and as such they are +unexpandable. This implies that they survive until the +last stages of \TeX\ processing. For example, +\begin{verbatim} +\count255=1{2} +\end{verbatim} +will assign~1 to \cs{count255}, +and print~`2', because the +opening brace functions as a delimiter for the number~1. +Similarly \begin{verbatim} +f{f} +\end{verbatim} +will prevent \TeX\ from forming +an `\hbox{ff}' ligature. + +From the fact that braces are unexpandable, +it follows that their nesting is independent +of the nesting of conditionals. For instance +\begin{verbatim} +\iftrue{\else}\fi +\end{verbatim} +will give an open brace, +as conditionals are handled by expansion. The closing +brace is simply skipped as part of the \gr{false text}; +any consequences it has for grouping only come into +play in a later stage of \TeX\ processing. + +Undelimited macro arguments are either single tokens +or groups of tokens enclosed in explicit braces. +Thus it is not possible for an explicit open or close brace +to be a macro argument. However, braces can be assigned +with \cs{let}, for instance as in \begin{verbatim} +\let\bgroup={ +\end{verbatim} +This is used in the plain \cs{footnote} macro +(see page~\pageref{footnote:ex}). + +%\spoint \csc{\char 123} and \csc{\char 125} +\subsection{Open and closing brace control symbols} +% \csc{\char 123} and \csc{\char 125}} + +The control sequences \verb-\{- and \verb-\}- do not really belong +\cstoidx\char123\par\cstoidx\char125\par +in this chapter, not being concerned with grouping. +They have been defined with \cs{let} as synonyms of +\cs{lbrace} and \cs{rbrace} respectively, +and these control sequences are \cs{delimiter} instructions +(see Chapter~\ref{mathchar}). + +The Computer Modern Roman font has no braces, but there are +braces in the typewriter font, and for mathematics +there are braces of different sizes \ldash and extendable ones \rdash in +the extension font. + +%%%% end of input file [group] + +%\InputFile:macro +%%%% this is input file [macro] +%\subject[macro] Macros +\endofchapter +\chapter{Macros}\label{macro} + +Macros are \TeX's abbreviation mechanism for sequences of commands +that are needed more than once, +somewhat like procedures in ordinary programming languages. +\TeX's parameter mechanism, however, is quite unusual. +This chapter explains how \TeX\ macros work. It also +treats the commands \cs{let} and~\cs{futurelet}. + +\begin{inventory} +\item [\cs{def}] + Start a macro definition. + +\item [\cs{gdef}] + Synonym for \verb-\global\def-. + +\item [\cs{edef}] + Start a macro definition; + the replacement text is expanded at definition time. + This command is treated also in the next chapter. + +\item [\cs{xdef}] + Synonym for \verb-\global\edef-. + +\item [\cs{csname}] + Start forming the name of a control sequence. + +\item [\cs{endcsname}] + Stop forming the name of a control sequence. + +\item [\cs{global}] + Make the next definition, arithmetic statement, + or assignment global. + +\item [\cs{outer}] + Prefix indicating that the macro being defined + can be used on the `outer' level only. + +\item [\cs{long}] + Prefix indicating that the arguments of the macro being defined + may contain \cs{par} tokens. + +\item [\cs{let}] + Define a control sequence to be equivalent to the next token. + +\item [\cs{futurelet}] + Define a control sequence to be equivalent to + the token after the next token. + +\end{inventory} + +%\point Introduction +\section{Introduction} + +A macro is basically a sequence of tokens that has +\term macro\par +been abbreviated into a control sequence. +Statements starting with (among others) \cs{def} +are called {\italic macro definitions}\alt, and +writing \begin{verbatim} +\def\abc{\de f\g} +\end{verbatim} +defines the macro \cs{abc}, +with the {\italic replacement text\/} \verb>\de f\g>. +Macros can be used in this way to abbreviate +pieces of text or sequences of commands +that have to be given more than once. +Any time that \TeX's expansion processor +encounters the control sequence \cs{abc}, +it replaces it by the replacement text. + +If a macro should be sensitive to the context +where it is used, it can be defined with parameters: +\begin{verbatim} +\def\PickTwo#1#2{(#1,#2)} +\end{verbatim} +takes two arguments and reproduces them in parentheses. +The call \cs{PickTwo 12} gives `(1,2)'. + +The activity of substituting the replacement text +for a macro is called {\italic macro expansion}. + +%\point Layout of a macro definition +\section{Layout of a macro definition} + +A macro definition consists of, in sequence, +\term definition !macro\par +\begin{enumerate} \item any number of \cs{global}, +\cs{long}, and \cs{outer} prefixes, +\item a \gr{def} control sequence, or anything +that has been \cs{let} to one, +\item a control sequence or active character to be defined, +\item possibly a \gr{parameter text} specifying among other things +how many parameters the macro has, and +\item a replacement text enclosed in explicit character tokens +with category codes 1 and~2, by default \verb-{- and~\verb-}- +in plain \TeX. +\end{enumerate} + +After a macro definition is completed, any saved \cs{afterassignment} +token (see section~\ref{sec:afterassignment}) is inserted. + +The `expanding' definitions \cs{edef} and \cs{xdef} +are treated in Chapter~\ref{expand}. + +%\point Prefixes +\section{Prefixes} + +There are three prefixes that alter the status of the +\term prefixes !macro\par +macro definition: \begin{description} +\item [\csidx{global}] +If the definition occurs inside a group, this prefix +makes the definition global. +This prefix can also be used for assignments other than +macro definitions; in fact, +for macro definitions abbreviations exist obviating the +use of \cs{global}: +\begin{disp}\verb>\gdef\foo...>\quad is equivalent to\quad \verb>\global\def\foo...> +\end{disp} and +\begin{disp}\verb>\xdef\foo...>\quad is equivalent to\quad \verb>\global\edef\foo...> +\end{disp} + +If the parameter \cs{globaldefs} +is positive, all assignments are +implicitly global; +if \cs{globaldefs} is negative any \cs{global} prefixes are +ignored, +and \cs{gdef} and \cs{xdef} make local definitions +(see Chapter~\ref{group}). + +\item [\cs{outer}] +The mechanism of `outer' macros is supposed to facilitate +\term macro !outer\par\cstoidx outer\par +locating (among other errors) unbalanced braces: an \cs{outer} +macro is supposed +to appear only in non-embedded contexts. +To be precise, it is not allowed to occur +\begin{itemize} +\item in macro replacement texts (but it can appear in + for instance \cs{edef} after + \cs{noexpand}, and after \cs{meaning}), +\item in parameter texts, +\item in skipped conditional text, +\item in alignment preambles, and +\item in the \gram{balanced text} of a \cs{message}, \cs{write}, +et cetera. \end{itemize} +For certain applications, however, it is inconvenient +that some of the plain macros are outer, +in particular macros such as \cs{newskip}. One remedy is to +redefine them, without the `outer' option, which +is done for instance in \LaTeX, but cleverer tricks are possible. + +\item [\cs{long}] +Ordinarily, macro parameters are not supposed to contain +\cstoidx long\par +\cs{par} tokens. This restriction is useful (much more so +than the \cs{outer} definitions) in locating +forgotten closing braces. +For example, \TeX\ will complain about a `runaway argument' +\message{Example on} +in the following sequence:\begin{verbatim} +\def\a#1{ ... #1 ... } +\a {This sentence should be in braces. + +And this is not supposed to be part of the argument +\end{verbatim} +\message{one page} +The empty line generates a \cs{par}, which most of the times +means that a closing brace has been forgotten. + +If arguments to a particular macro should be allowed +to contain \cs{par} tokens, then the macro must be declared +to be \cs{long}. \end{description} + +The \cs{ifx} test for equality of tokens +(see Chapter~\ref{if}) takes prefixes into +account when testing whether two tokens have the same definition. + +\begin{comment} +With a little ingenuity it is possible +for \cs{par} tokens to sneak into macro arguments anyway. +Consider the example +\begin{verbatim} +\def\a#1\par!{ ... } +\a bc\par ef\par! +\end{verbatim} +Here the macro \cs{a} is not \cs{long}, but the argument +is \verb>bc\par ef>, which contains a \cs{par} token. +However, +this is of no importance in general. +\end{comment} + +%\point The definition type +\section{The definition type} + +There are four \gr{def} control sequences in \TeX: +\csidx{def}, \csidx{gdef}, \csidx{edef}, and \csidx{xdef}. +The control sequence +\alt +\cs{gdef} is a synonym for \verb>\global\def> and +\cs{xdef} is a synonym for \verb>\global\edef>. +The `expanding definition' \cs{edef} is treated in +Chapter~\ref{expand}. + +The difference between the various types of macro definitions +is only relevant at the time of the definition. +When a macro is called there is no way of telling how +it was defined. + +%\point[param:text] The parameter text +\section{The parameter text} +\label{param:text} + +Between the control sequence or active character to be defined +\term parameter\par\term argument\par +and the opening brace of the replacement text, a \gr{parameter +text} can occur. This specifies whether the macro has parameters, +how many, and how they are delimited. +The \gr{parameter text} cannot contain +explicit braces. + +A macro can have at most nine parameters. +A~parameter is indicated by a parameter token, +consisting of a macro parameter character +(that is, a character of category code~6, in plain \TeX~\verb=#=) +followed by a digit~\n1--\n9. +For instance, \verb>#6>~denotes the sixth parameter of a macro. +Parameter tokens cannot appear outside the context +of a macro definition. + +In the parameter text, +parameters must be numbered consecutively, starting at~1. +A~space after a parameter token is significant, +both in the parameter text and the replacement text. + +Parameters can be delimited or undelimited. A~parameter +is called undelimited if it is followed immediately +by another parameter in the \gr{parameter text} +or by the opening brace of the replacement text; +it is called delimited if it is followed by any other token. + +The tokens (zero or more) that are substituted for +a parameter when a macro is expanded (or `called') +are called +the `argument' corresponding to that parameter. + +%\spoint Undelimited parameters +\subsection{Undelimited parameters} + +When a macro with an undelimited parameter, for instance +\term parameter !undelimited\par +a macro \cs{foo} with one parameter +\begin{verbatim} +\def\foo#1{ ... #1 ...} +\end{verbatim} +is expanded, \TeX\ scans ahead (without expanding) +until a non-blank token is found. +If this token is not an explicit \gr{left brace}, +it is taken to be the argument +corresponding to the parameter. Otherwise a \gr{balanced text} +is absorbed by scanning until the matching explicit +\gr{right brace} has been found. +This balanced text then +constitutes the argument. + +An example with three undelimited parameters follows: with +\begin{verbatim} +\def\foo#1#2#3{#1(#2)#3} +\end{verbatim} +the macro call \cs{foo123} gives `\hbox{1(2)3}'; +but \hbox{\verb-\foo 1 2 3-} also gives the same result. +In the call +\begin{disp}\cs{foo}\n{\char32 1\char32 2\char 32 3}\end{disp} +the first space is skipped in the input processor of \TeX. +The argument corresponding to the first parameter is then +the~\n1. In order to find the second parameter \TeX\ then +skips all blanks, in this case exactly one. As second +parameter \TeX\ finds then the~\n2. Similarly the third +parameter is~\n3. + + +In order to pass several tokens as one undelimited argument +one can use braces. With the above definition of \cs{foo} +the call \verb>\foo a{bc}d> gives `\hbox{a(bc)d}'. +When the argument of a macro is a balanced text instead of +a single token, the delimiting braces are not inserted when +the argument is +inserted in the replacement text. +For example:\begin{verbatim} +\def\foo#1{\count0=1#1\relax} +\foo{23} +\end{verbatim} +will expand to \verb>\count0=123\relax>, +which assigns the value of 123 to the counter. +On the other hand, the statement \begin{verbatim} +\count0=1{23} +\end{verbatim} +would +assign~1 and print~23. + +%\spoint Delimited parameters +\subsection{Delimited parameters} + +Apart from enclosing it in braces there is another way +\term parameter !delimited\par +to pass a sequence of tokens as a single argument to a macro, +namely by using delimited parameters. + +Any non-parameter tokens in the \gr{parameter text} occurring +after a macro parameter (that is, after the parameter number +following the parameter character) +act as a delimiter for that parameter. This includes space tokens: +a space after a parameter number is significant. +Delimiting tokens can also occur between the control +sequence being defined and the first parameter token~\verb>#1>. + +Character tokens acting as delimiters in the parameter text +have both their character code and +category code stored; the delimiting character tokens of the +actual arguments have to match both. +Category codes of such characters may include some that +can normally only appear in special contexts; for instance, after +the definition \begin{verbatim} +\def\foo#1_#2^{...} +\end{verbatim} +the macro \cs{foo} +can be used outside math mode. + +When looking for the argument corresponding to +a delimited parameter, \TeX\ absorbs all tokens without expansion (but +balancing braces) until the +(exact sequence of) delimiting tokens is encountered. +The delimiting tokens are not part of the argument; +they are removed from the input stream during the macro call. + +%\spoint Examples with delimited arguments +\subsection{Examples with delimited arguments} + +As a simple example, \begin{verbatim} +\def\DoASentence#1#2.{{#1#2.}} +\end{verbatim} +defines a macro with an undelimited first parameter, +and a second parameter delimited by a period. +In the call\begin{verbatim} +\DoASentence \bf This sentence is the argument. +\end{verbatim} +the arguments are: +\begin{verbatim} +#1<-\bf +#2<-This sentence is the argument +\end{verbatim} +Note that the closing period is not in the argument, but it has +been absorbed; it is no longer in the input stream. + +A~commonly used delimiter is \cs{par}: +\begin{verbatim} +\def\section#1. #2\par{\medskip\noindent {\bf#1. #2\par}} +\end{verbatim} +This macro has a first parameter that is delimited by~`\n{.\char32}', +and a second parameter that is delimited by \cs{par}. +The call\message{example on one page} +\begin{verbatim} +\section 2.5. Some title + +The text of the section... +\end{verbatim} +will give +\begin{disp}\verb>#1<-2.5>\nl +\verb>#2<-Some title>\n{\char32}\end{disp} +Note that there is a space at the end of the second argument +generated by the line end. If this space is unwanted one might +define \begin{verbatim} +\def\section#1. #2 \par{...} +\end{verbatim} +with \n{\char32}\cs{par} delimiting the second +argument. This approach, however, +precludes the user's writing the \cs{par} explicitly: +\begin{verbatim} +\section 2.5 Some title\par +\end{verbatim} +One way out of this dilemma is to write +\verb>#2\unskip> on all places in the definition text +where the trailing space would be unwanted. + +Control sequences acting as delimiters need not be defined, +as they are absorbed without expansion. Thus +\begin{verbatim} +\def\control#1\sequence{...} +\end{verbatim} +is a useful +definition, even if \cs{sequence} is undefined. + +The importance of category codes in delimited arguments +is shown by the following example: +\begin{verbatim} +\def\a#1 #2.{ ... } +\catcode`\ =12 +\a b c +d. +\end{verbatim} +which gives +\begin{verbatim} +\a #1 #2.-> ... +#1<- b c +#2<-d +\end{verbatim} +Explanation: the delimiter between parameters 1 and~2 is a space +of category~10. In between \n{a} and \n{b} there is a space +of category~12; the first space of category~10 +is the space that is generated by the line end. + +For a `real-life' application of matching of category codes, +see the explanation of \cs{newif} in Chapter~\ref{if}, +and the example on page~\pageref{ex:jobnumber}. + + +%\spoint Empty arguments +\subsection{Empty arguments} + +If the user specifies a \gr{balanced text} in braces +when \TeX\ expects a macro +argument, that text is used as the argument. +Thus, specifying \verb-{}- will give an argument that is +an empty list of tokens; this is called an `empty argument'. + +Empty arguments can also arise from the use of delimited +parameters. For example, after the definition +\begin{verbatim} +\def\mac#1\ro{ ... } +\end{verbatim} +the call +\begin{verbatim} +\mac\ro +\end{verbatim} +will give an empty argument. + +\begin{comment} +However, only +one empty argument can be created this way: +if the macro had been defined as +\begin{verbatim} +\def\mac#1#2\ro{ ... } +\end{verbatim} +the same call +\begin{verbatim} +\mac\ro \othermacro \stillothermacro +\end{verbatim} +will probably cause a `\n{Runaway argument?}' error message. +Explanation: the first parameter is undelimited, so the corresponding +argument is `\cs{ro}'; after that \TeX\ starts looking for a list +of tokens delimited by~\cs{ro}. +\end{comment} + +%\spoint The macro parameter character +\subsection{The macro parameter character} + +When \TeX's input processor scans a macro definition text, +\term character !parameter\par +it inserts a parameter token for any +occurrence of a macro parameter character followed by a digit. +In effect, a parameter token in the replacement text +states `insert parameter number such and such here'. +Two parameter characters in a row are replaced by a single one. + +The latter fact can be used for nested macro definitions. +\label{nest:def}\howto Nested macro definitions\par +Thus \begin{verbatim} +\def\a{\def\b#1{...}} +\end{verbatim} +gives an error message +because \cs{a} was defined without parameters, and +yet there is a parameter token in its replacement text. + +The following +\begin{verbatim} +\def\a#1{\def\b#1{...}} +\end{verbatim} +defines a macro \cs{a} that +defines a macro \cs{b}. However, \cs{b} still does not +have any parameters: the call +\begin{verbatim} +\a z +\end{verbatim} +defines a macro \cs{b} without parameters, +that has to be followed by a~\n z. +Note that this +does not attempt to define a macro \cs{bz}, because the +control sequence \cs{b} has already been formed in \TeX's +input processor when that input line was read. + +Finally, +\begin{verbatim} +\def\a{\def\b##1{...}} +\end{verbatim} +defines a macro \cs{b} +with one parameter. + +Let us examine the handling of the parameter character +in some detail. +Consider \begin{verbatim} +\def\a#1{ .. #1 .. \def\b##1{ ... }} +\end{verbatim} +When this is read as input, the input processor +\begin{itemize} +\item replaces the characters \verb>#1> by \gr{parameter token$_1$}, and +\item replaces the characters \verb>##> by \verb>#>\end{itemize} +A macro call of \cs{a} will then let the input processor scan +\begin{verbatim} +\def\b#1{ ... } +\end{verbatim} +in which the two characters \verb>#1> are +\alt +replaced by a parameter token. + +%\spoint Brace delimiting +\subsection{Brace delimiting} + +Ordinarily, it is not possible to have left or right +braces in the \gr{parameter text} of a definition. +There is a special mechanism, however, that can make +the last parameter of a macro act as if it is delimited +by an opening brace. + +If the last parameter token +is followed by a parameter character (\verb>#>), +which in turn is followed by the opening brace of the +replacement text, \TeX\ makes the last parameter +be delimited by a beginning-of-group character. +Furthermore, unlike other delimiting tokens in +parameter texts, this opening brace is not +removed from the input stream. + +Consider an example. +Suppose we want to have a macro +\cs{every} that can fill token lists as follows: +\begin{verbatim} +\every par{abc} \every display{def} +\end{verbatim} +This macro can be defined as +\begin{verbatim} +\def\every#1#{\csname every#1\endcsname} +\end{verbatim} +In the first call above, the argument corresponding to +the parameter is \n{abc}, so the call +expands to +\begin{verbatim} +\csname everypar\endcsname{abc} +\end{verbatim} +which gives the desired result. + + +%\point[cs:name] Construction of control sequences +\section{Construction of control sequences} +\label{cs:name} + +The commands \csidx{csname} and \csidx{endcsname} can be used +to construct a control sequence. +For instance \begin{verbatim} +\csname hskip\endcsname 5pt +\end{verbatim} +is equivalent to \verb=\hskip5pt=. + +During this construction process +all macros and other expandable control sequences +between \cs{csname} and \cs{endcsname} +are expanded as usual, until only unexpandable +character tokens remain. A~variation of the above example, +\begin{verbatim} +\csname \ifhmode h\else v\fi skip\endcsname 5pt +\end{verbatim} +performs an \cs{hskip} or \cs{vskip} depending on the mode. +The final result of the expansion should +consist of only character tokens, but +their category codes do not matter. +An unexpandable control sequence gives an error here: +\TeX\ will insert an \cs{endcsname} right before it +as an attempt at error recovery. + +With \cs{csname} it is possible to construct +control sequences that cannot ordinarily be written, +because the constituent character tokens may have another category +\alt +than~11, letter. This principle can be used to hide +\howto Hide counters from the user\par +inner control sequences of a macro package from the user. +\begin{example}\begin{verbatim} +\def\newcounter#1{\expandafter\newcount + \csname #1:counter\endcsname} +\def\stepcounter#1{\expandafter\advance + \csname #1:counter\endcsname 1\relax} +\end{verbatim} +In the second definition the \cs{expandafter} is superfluous, +but it does no harm, and it is conceptually clearer. +\end{example} + +The name of the actual counter created by \cs{newcounter} +contains a colon, so that it takes some effort to write this +control sequence. In effect, the counter +is now hidden from the user, who can only +access it through control sequences such as \cs{stepcounter}. +By the way, the macro \cs{newcount} is defined \cs{outer} in +the plain format, so the above definition of \cs{newcounter} +can only be written after \cs{newcount} has been redefined. + +If a control sequence formed with \verb>\csname...\endcsname> +has not been defined +before, its meaning is set to \cs{relax}. +Thus if \verb=\xx= is an undefined control sequence, the +command \begin{verbatim} +\csname xx\endcsname +\end{verbatim} +will {\em not\/} +give an error message, as it is equivalent to \verb=\relax=. +Moreover, after this execution of the +\verb-\csname...\endcsname- statement, the control sequence +\verb=\xx= is itself equivalent to \cs{relax}, so it +will no longer give an `undefined control sequence' error +(see also page~\pageref{relax:cs}). + + +%\point Token assignments by \cs{let} and \cs{futurelet} +\section{Token assignments by \protect\cs{let} and \protect\cs{futurelet}} + +There are two \gr{let assignment}s in \TeX. +Their syntax is +\begin{disp}\cs{let}\gr{control sequence}\gr{equals}% + \gr{one optional space}\gr{token}\nl + \cs{futurelet}\gr{control sequence}\gr{token}\gr{token} + \end{disp} +In the syntax of a \cs{futurelet} assignment +no optional equals sign appears. + +%\spoint[let] \cs{let} +\subsection{\protect\cs{let}} +\label{let} + +The primitive command \csidx{let} assigns the current meaning +of a~token to a control sequence or active character. + +For instance, in the plain format \cs{endgraf} is defined +as \begin{verbatim} +\let\endgraf=\par +\end{verbatim} +This enables macro writers to redefine \cs{par}, while +still having the functionality of the primitive \cs{par} +command available. For example, +\begin{verbatim} +\everypar={\bgroup\it\def\par{\endgraf\egroup}} +\end{verbatim} + +The case where the \gr{token} to be assigned is not a control +sequence but a character token instead has been treated +in Chapter~\ref{char}. + +%\spoint \cs{futurelet} +\subsection{\protect\cs{futurelet}} + +As was explained above, the sequence with \cs{let} +\begin{disp}\cs{let}\gr{control sequence}\gr{token$_1$}\gr{token$_2$}% + \gr{token$_3$}\gr{token$\cdots$}\end{disp} +assigns (the meaning of) \gr{token$_1$} to the control sequence, +and the remaining input stream looks like +\begin{disp}\gr{token$_2$}\gr{token$_3$}\gr{token$\cdots$}\end{disp} +That is, the \gr{token$_1$} has disappeared from the stream. + +The command \csidx{futurelet} works slightly differently: +given the input stream +\begin{disp}\cs{futurelet}\gr{control sequence}\gr{token$_1$}\gr{token$_2$}% + \gr{token$_3$}\gr{token$\cdots$}\end{disp} +it assigns (the meaning of) \gr{token$_2$} to the control sequence, +and the remaining stream looks like +\begin{disp}\gr{token$_1$}\gr{token$_2$}\gr{token$_3$}\gr{token$\cdots$}\end{disp} +That is, neither \gr{token$_1$} nor \gr{token$_2$} has +been lifted from the stream. +However, now \gr{token$_1$} +`knows' what \gr{token$_2$} is, without having had to absorb it +as a macro parameter. See an example below. + +If a character token has been \cs{futurelet} to a control +sequence, its category code is fixed. +The subsequent \gr{token$_1$} cannot change +it anymore. + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Active characters +\subsection{Active characters} + +Character tokens of category~13, `active characters', +\altt +can be defined just like +\term active character\par\term character !active\par +control sequences. +If the definition of the character appears inside a macro, +the character has to be active at the time of the definition +of that macro. + +Consider for example the following definition +(taken from Chapter~\ref{mouth}):\begin{verbatim} +{\catcode`\^^M=13 % + \gdef\obeylines{\catcode`\^^M=13 \def^^M{\par}}% +} +\end{verbatim} +The unusual category of the \verb>^^M> character +has to be set during the definition of \cs{obeylines}, +otherwise \TeX\ would think that the line ended +after \cs{def}. + +%\spoint Macros versus primitives +\subsection{Macros versus primitives} + +The distinction between primitive commands and user macros +\term primitive commands\par\term command !primitive\par +is not nearly as important in \TeX\ as it is in other +programming languages.\begin{itemize} +\item The user can use primitive commands under different names: + \begin{verbatim} +\let\StopThisParagraph=\par +\end{verbatim} +\item Names of primitive commands can be used for + user macros: \begin{verbatim} +\def\par{\hfill$\bullet$\endgraf} +\end{verbatim} +\item Both user macros and a number of \TeX\ primitives + are subject to expansion, for instance all conditionals, + and commands such as \cs{number} and~\cs{jobname}. +\end{itemize} + +%\spoint Tail recursion +\subsection{Tail recursion} + +Macros in \TeX, like procedures in most modern programming +\term recursion\par +languages, are allowed to be recursive: that is, the +definition of a macro can contain a call to this same macro, +or to another macro that will call this macro. +Recursive macros tend to clutter up \TeX's memory +if too many `incarnations' of such a macro are active +at the same time. However, \TeX\ is able to prevent this +in one frequently occurring case of recursion: tail recursion. + +In order to appreciate what goes on here, some background +knowledge is needed. When \TeX\ starts executing a macro +it absorbs the parameters, and places an item pointing to +the replacement text on the input stack, +\term input! stack\par +so that the scanner will next be directed to +this replacement. Once it has been processed, the item on the +input stack can be removed. +However, if the definition text +of a macro contains further macros, this process will be +repeated for them: new items may be placed on the input stack +directing the scanner to other macros +even before the first one has been completed. + +In general this `stack build-up' is a necessary evil, but +it can be prevented if the nested macro call is the +{\em last\/} token in the replacement text of the original +macro. After the last token no further tokens need to be +considered, so one might as well clear the top item +from the input stack +before a new one is put there. +This is what \TeX\ does. + +The \csidx{loop} macro of plain \TeX\ provides a good illustration +\label{loop:ex} +of this principle. The definition is +\begin{verbatim} +\def\loop#1\repeat{\def\body{#1}\iterate} +\def\iterate{\body \let\next=\iterate + \else \let\next=\relax\fi \next} +\end{verbatim} +and this macro can be called for example as follows: +\begin{verbatim} +\loop \message{\number\MyCount} + \advance\MyCount by 1 + \ifnum\MyCount<100 \repeat +\end{verbatim} +The macro \cs{iterate} can call itself and, when it does so, +the recursive call is performed by the last token in the list. +It would have been possible to define \cs{iterate} +as \begin{verbatim} +\def\iterate{\body \iterate\fi} +\end{verbatim} +but then \TeX\ would not have been able to resolve the recursion +as the call \cs{iterate} is not the last token in the replacement +text of \cs{iterate}. Assigning \verb>\let\next=\iterate> +is here a way to let +the recursive call be the last token in the list. + +Another way of resolving tail recursion is to use +\cs{expandafter} (see page~\pageref{after:cond}): in +\begin{verbatim} +\def\iterate{\body \expandafter\iterate\fi} +\end{verbatim} +it removes the \cs{fi} token. +Tail recursion would also be resolved if the last +tokens in the list were arguments for the +recursive macro. + +An aside: by defining \cs{iterate} as +\begin{verbatim} +\def\iterate{\let\next\relax + \body \let\next\iterate \fi \next} +\end{verbatim} +it becomes possible to write +\begin{verbatim} +\loop ... \if... ... \else ... \repeat +\end{verbatim} + +%\point Macro techniques +\section{Macro techniques} + +%\spoint Unknown number of arguments +\subsection{Unknown number of arguments} + +In some applications, +\howto Macros with an undetermined number +of arguments\par +a macro is needed that can have a +number of arguments that is not specified in advance. + +Consider the problem of translating a position on a chess board +(for full macros and fonts, see~\cite{chess} and~\cite{Tut}), +given like +\begin{verbatim} +\White(Ke1,Qd1,Na1,e2,f4) +\end{verbatim} +to a sequence of typesetting instructions +\begin{verbatim} +\WhitePiece{K}{e1} \WhitePiece{Q}{d1} \WhitePiece{N}{a1} +\WhitePiece{P}{e2} \WhitePiece{P}{f4} +\end{verbatim} +Note that for pawns the `P' is omitted in the list of positions. + +The first problem is that the list of pieces +is of variable length, so we append a terminator piece: +\begin{verbatim} +\def\White(#1){\xWhite#1,xxx,} +\def\endpiece{xxx} +\end{verbatim} +for which we can test. +Next, the macro \cs{xWhite} takes one position from the list, +tests whether it is the terminator, and if not, +subjects it to a test to see whether it is a pawn. +\begin{verbatim} +\def\xWhite#1,{\def\temp{#1}% + \ifx\temp\endpiece + \else \WhitePieceOrPawn#1XY% + \expandafter\xWhite + \fi} +\end{verbatim} +An \cs{expandafter} command is necessary to remove the +\cs{fi} (see page~\pageref{after:cond}), so that +\cs{xWhite} will get the next position as argument +instead of \cs{fi}. + +Positions are either two or three characters long. +The call to \cs{White\-Piece\-OrPawn}, a four-parameter macro, +appended a terminator string \n{XY}. +In the case of a pawn, therefore, argument~3 is the character~\n X +and argument~4 is empty; for all other pieces argument~1 +is the piece, 2~and~3 are the position, and argument~4 is~\n X. +\begin{verbatim} +\def\WhitePieceOrPawn#1#2#3#4Y{ + \if#3X \WhitePiece{P}{#1#2}% + \else \WhitePiece{#1}{#2#3}\fi} +\end{verbatim} + +%\spoint Examining the argument +\subsection{Examining the argument} + +It may be necessary in some cases to test whether a macro +\howto Examine a macro argument for the presence of some element\par +\howto Apply \cs{uppercase} when the argument has a \cs{footnote}\par +argument contains some element. For a real-life example, +consider the following (see also the \cs{DisplayEquation} +\alt +example on page~\pageref{left:display}). + +Suppose the title and author of an article are given as +\begin{verbatim} +\title{An angle trisector} +\author{A.B. Cee\footnote*{Research supported by the +Very Big Company of America}} +\end{verbatim} +with multiple authors +given as +\begin{verbatim} +\author{A.B. Cee\footnote*{Supported by NSF grant 1} + \and + X.Y. Zee\footnote{**}{Supported by NATO grant 2}} +\end{verbatim} +Suppose further that the \cs{title} and \cs{author} macros +are defined as +\begin{verbatim} +\def\title#1{\def\TheTitle{#1}} \def\author#1{\def\TheAuthor{#1}} +\end{verbatim} +which will be used as +\begin{verbatim} +\def\ArticleHeading{ ... \TheTitle ... \TheAuthor ... } +\end{verbatim} + +For some journals it is required to +have the authorship and the title of the article in all capitals. +The implementation of this could be +\begin{verbatim} +\def\ArticleCapitalHeading + { ... + \uppercase\expandafter{\TheTitle} + ... + \uppercase\expandafter{\TheAuthor} + ... + } +\end{verbatim} +Now the \cs{expandafter} commands will expand the title and +author into the actual texts, and the \cs{uppercase} commands +will capitalize them. However, for the authors this is wrong, +since the \cs{uppercase} command will also capitalize the +footnote texts. +The problem is then to uppercase only the parts +of the title in between the footnotes. + +As a first attempt, let us take the case of one author, and +let the basic call be +\begin{verbatim} +\expandafter\UCnoFootnote\TheAuthor +\end{verbatim} +This expands into +\begin{verbatim} +\UCnoFootnote A.B. Cee\footnote*{Supported ... } +\end{verbatim} +The macro +\begin{verbatim} +\def\UCnoFootnote#1\footnote#2#3{\uppercase{#1}\footnote{#2}{#3}} +\end{verbatim} +will analyse this correctly: +\begin{verbatim} +#1<-A.B. Cee +#2<-* +#3<-Supported ... +\end{verbatim} +However, if there is no footnote, this macro is completely wrong. + +As a first refinement we add a footnote ourselves, just to make +sure that one is present: +\begin{verbatim} +\expandafter\UCnoFootnote\TheAuthor\footnote 00 +\end{verbatim} +Now we have to test what kind of footnote we find: +\begin{verbatim} +\def\stopper{0} +\def\UCnoFootnote#1\footnote#2#3{\uppercase{#1}\def\tester{#2}% + \ifx\stopper\tester + \else\footnote{#2}{#3}\fi} +\end{verbatim} +With \cs{ifx} we test the delimiter footnote sign against the +actual sign encountered. Note that a solution with +\begin{verbatim} +\ifx0#2 +\end{verbatim} +would be wrong if the footnote sign consists +of more than one token, for instance~\verb>{**}>. + +The macro so far is correct if there was no footnote, +but if there was one it is wrong: +the terminating tokens remain to be disposed of. +They are taken care of in the following version: +\begin{verbatim} +\def\stopper{0} +\def\UCnoFootnote#1\footnote#2#3{\uppercase{#1}\def\tester{#2}% + \ifx\stopper\tester + \else\footnote{#2}{#3}\expandafter\UCnoFootnote + \fi} +\end{verbatim} +A repeated call to \cs{UCnoFootnote} removes the delimiter tokens +(the \cs{expandafter} first removes the \cs{fi}), +and as an added bonus, this macro is also correct for multiple +authors. + + +%\spoint Optional macro parameters with \cs{futurelet} +\subsection{Optional macro parameters with \protect\cs{futurelet}} + +One standard application of \cs{futurelet} is implementing +\howto Macros with optional parameters\par +optional parameters of macros. The general course of action +is as follows: +\begin{verbatim} +\def\Com{\futurelet\testchar\MaybeOptArgCom} +\def\MaybeOptArgCom{\ifx[\testchar \let\next\OptArgCom + \else \let\next\NoOptArgCom \fi \next} +\def\OptArgCom[#1]#2{ ... }\def\NoOptArgCom#1{ ... } +\end{verbatim} +Note that \cs{ifx} is used even though it tests +for a character. The reason is of course that, +if the optional argument is omitted, there might be an +expandable control sequence behind the~\cs{Com}. + +The macro \cs{Com} now has one optional and one regular +argument; it can be called as +\begin{verbatim} +\Com{argument} +\end{verbatim} +or as\begin{verbatim} +\Com[optional]{argument} +\end{verbatim} +Often the call without the optional argument will insert some +default value: +\begin{disp}\verb>\def\NoOptArgCom#1{\OptArgCom[>% +{\italic default\/}\verb>]{#1}}>\end{disp} +This mechanism is widely used in formats such as \LaTeX\ and +\LamsTeX; see also~\cite{svb:future}. + + + +%\spoint Two-step macros +\subsection{Two-step macros} + +Often what looks to the user like one macro is in reality +a two-step process, where one macro will set up conditions, +and a second macro will do the work. + +As an example, here is +a macro \cs{PickToEol}\label{pick:eol} +\howto Take an input line as macro argument\par +with an argument that is delimited by the line end. +First we write a macro without arguments that +changes the category code of the line end, and then +calls the second macro. +\begin{verbatim} +\def\PickToEol{\begingroup\catcode`\^^M=12 \xPickToEol} +\end{verbatim} +The second macro can then take as an argument everything +up to the end of the line: +\begin{verbatim} +\def\xPickToEol#1^^M{ ... #1 ... \endgroup} +\end{verbatim} +There is one problem with this definition: the \verb>^^M> character +should have category~12. We arrive at the following: +\begin{verbatim} +\def\PickToEol{\begingroup\catcode`\^^M=12 \xPickToEol} +{\catcode`\^^M=12 % + \gdef\xPickToEol#1^^M{ ... #1 ... \endgroup}% +} +\end{verbatim} +where the category code of \verb>^^M> is changed for the +sake of the definition of \cs{xPickToEol}. Note that +the \verb>^^M> in \cs{PickToEol} occurs in a control symbol, +so there the category code is irrelevant. Therefore that +definition can be outside the group where the category code +of \verb>^^M> is redefined. + + +%\spoint A comment environment +\subsection{ A comment environment} + +As an application of the above idea of two-step macros, +\howto Comment environment\par +and in order to illustrate tail recursion, here are +macros for a `comment' environment. + +Often it is necessary to remove a part of \TeX\ +input temporarily. For this one would like to +write \begin{verbatim} +\comment +... +\endcomment +\end{verbatim} +The simplest implementation of this, +\begin{verbatim} +\def\comment#1\endcomment{} +\end{verbatim} +has a number of weaknesses. For instance, +it cannot cope with outer macros or input that +does not have balanced braces. Its worst +shortcoming, however, is that it reads the complete +comment text as a macro argument. This limits the size +of the comment to that of \TeX's input buffer. + +It would be a better idea to take on the out-commented +text one line at a time. For this we want to write +a recursive macro with a basic structure +\begin{verbatim} +\def\comment#1^^M{ ... \comment } +\end{verbatim} +In order to be able to write this definition at all, +the category code of the line end must be changed; as above +\altt +we will have +\begin{verbatim} +\def\comment{\begingroup \catcode`\^^M=12 \xcomment} +{\catcode`\^^M=12 \endlinechar=-1 % + \gdef\xcomment#1^^M{ ... \xcomment} +} +\end{verbatim} +Changing the \cs{endlinechar} is merely to +prevent having to put comment characters at the end +of every line of the definition. + +Of course, the process must stop at a certain time. +To this purpose we investigate the line that was +scooped up as macro argument: +\begin{verbatim} +{\catcode`\^^M=12 \endlinechar=-1 % + \gdef\xcomment#1^^M{\def\test{#1} + \ifx\test\endcomment \let\next=\endgroup + \else \let\next=\xcomment \fi + \next} +} +\end{verbatim} +and we have to define \cs{endcomment}: +\begin{verbatim} +\def\endcomment{\endcomment} +\end{verbatim} +This command will never be executed: it is merely for purposes +of testing whether the end of the environment has been reached. + +We may want to comment out text that is not syntactically +correct. Therefore we switch to a verbatim mode +\term verbatim mode\par +when commenting. The following macro is given +in plain \TeX: +\begin{verbatim} +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} +\end{verbatim} +We use it to define \cs{comment} as follows: +\begin{verbatim} +\def\makeinnocent#1{\catcode`#1=12 } +\def\comment{\begingroup + \let\do=\makeinnocent \dospecials + \endlinechar`\^^M \catcode`\^^M=12 \xcomment} +\end{verbatim} +Apart from the possibility mentioned above of commenting +out text that is not syntactically correct, for instance +because of unmatched braces, this solution can handle +outer macros. The former implementation of \cs{xcomment} +would cause a \TeX\ error if one occurred in the comment text. + +However, using verbatim mode poses the problem of concluding the +environment. +\altt +The final line of the comment is now not the control sequence +\cs{endcomment}, but the characters constituting it. We have +to test for these then: +\begin{verbatim} +{\escapechar=-1 + \xdef\endcomment{\string\\endcomment} +} +\end{verbatim} +The sequence \verb>\string\\> gives a backslash. +We could not have used +\begin{verbatim} +\edef\endcomment{\string\endcomment} +\end{verbatim} +because +the letters of the word \n{endcomment} would then have +category code~12, instead of the 11 that the ones on the +last line of the comment will have. + +%%%% end of input file [macro] + +%\InputFile:expand +%%%% this is input file [expand] +%\subject[expand] Expansion +\endofchapter +\chapter{Expansion}\label{expand} + +Expansion in \TeX\ is rather different from procedure calls +\term expansion\par +in most programming languages. This chapter treats the +commands connected with expansion, and gives a number of +(non-trivial) examples. + +\begin{inventory} +\item [\cs{relax}] + Do nothing. + + +\item [\cs{expandafter}] + Take the next two tokens and place the expansion of the + second after the first. + +\item [\cs{noexpand}] + Do not expand the next token. + + +\item [\cs{edef}] + Start a macro definition; + the replacement text is expanded at definition time. + + +\item [\cs{aftergroup}] + Save the next token for insertion after the current group. + +\item [\cs{afterassignment}] + Save the next token for execution after the next assignment + or macro definition. + + +\item [\cs{the}] + Expand the value of various quantities in \TeX\ into a string + of character tokens. + +\end{inventory} + + +%\point Introduction +\section{Introduction} + +\TeX's expansion processor accepts a stream of tokens +coming out of the input processor, and its result is +again a stream of tokens, which it feeds to the execution +processor. For the input processor there are two +kinds of tokens: expandable and unexpandable ones. +The latter category is passed untouched, and it contains +largely assignments and typesettable material; +the former category +is expanded, and the result of that expansion is examined anew. + +%\point Ordinary expansion +\section{Ordinary expansion} + +The following list gives those constructs +that are expanded, unless +expansion is inhibited: +\begin{itemize} +\item macros\label{expand:lijst} +\term expansion!expandable control sequences\par +\item conditionals +\item \cs{number}, \cs{romannumeral} +\item \cs{string}, \cs{fontname}, \cs{jobname}, + \cs{meaning}, \cs{the} +\item \verb,\csname ... \endcsname, +\item \cs{expandafter}, \cs{noexpand} +\item \cs{topmark}, \cs{botmark}, \cs{firstmark}, + \cs{splitfirstmark}, \cs{splitbotmark} +\item \cs{input}, \cs{endinput} +\end{itemize} + +This is the list of all instances where +expansion is inhibited: +\begin{itemize}\label{noexp:list} +\item when \TeX\ is reading a token to be defined by + \begin{itemize} \item a \gr{let assignment}, that is, + by \cs{let} or \cs{futurelet}, + \item a \gr{shorthand definition}, that is, + by \cs{chardef} or \cs{mathchardef}, or a + \gr{register def}, that is, \cs{countdef}, + \cs{dimendef}, \cs{skipdef}, \cs{muskipdef}, + or~\cs{toksdef}, + \item a \gr{definition}, that is a macro definition + with \cs{def}, \cs{gdef}, \cs{edef}, or~\cs{xdef}, + \item the \gr{simple assignment}s \cs{read} and \cs{font}; + \end{itemize} +\item when a \gr{parameter text} or macro arguments + are being read; also when the replacement text of a + control sequence + being defined by \cs{def}, \cs{gdef}, or \cs{read} + is being read; +\item when the token list for a \gr{token variable} or + \cs{uppercase}, \cs{lowercase}, or \cs{write} + is being read; however, the token list for \cs{write} + will be expanded later when it is shipped out; +\item when tokens are being deleted during error recovery; +\item when part of a conditional is being skipped; +\item in two instances when \TeX\ has to know what follows + \begin{itemize}\item after a left quote in a context where + that is used to denote an integer (thus in + \verb-\catcode`\a- the \cs{a} is not expanded), or + \item after a math shift character that begins math mode + to see whether another math shift character follows (in which case + a display opens); + \end{itemize} +\item when an alignment preamble is being scanned; however, + in this case a~token + preceded by \cs{span} and the tokens in a \cs{tabskip} + assignment are still expanded. +\end{itemize} + +%\point Reversing expansion order +\section{Reversing expansion order} + +Every once in a while you need to change the normal order of +expansion of tokens. \TeX\ provides several mechanisms for +this. Some of the control sequences in this section are +not strictly concerned with expansion. + +%\spoint One step expansion: \cs{expandafter} +\subsection{One step expansion: \protect\cs{expandafter}} + +The most obvious tool for reversed expansion order is +\csidx{expandafter}. The sequence +\begin{disp}\cs{expandafter}\gr{token$_1$}\gr{token$_2$}\end{disp} +expands to \begin{disp}\gr{token$_1$}\gr{\italic the expansion of token$_2$} +\end{disp} +Note the following. +\begin{itemize} \item If \gr{token$_2$} is a macro, it is replaced +by its replacement text, not by its final expansion. +Thus, if +\begin{verbatim} +\def\tokentwo{\ifsomecondition this \else that \fi} +\def\tokenone#1{ ... } +\end{verbatim} +the call \begin{verbatim} +\expandafter\tokenone\tokentwo +\end{verbatim} +will give \cs{ifsomecondition} as the parameter +to \cs{tokenone}: +\begin{verbatim} +\tokenone #1-> ... +#1<-\ifsomecondition +\end{verbatim} +\item If the \cs{tokentwo} is a macro with one or more +parameters, sufficiently many subsequent tokens will be absorbed +to form the replacement text.\end{itemize} + +%\spoint[expand:edef] Total expansion: \cs{edef} +\subsection{Total expansion: \protect\cs{edef}} +\label{expand:edef} + +Macros are usually defined by \cs{def}, but for the cases where +one wants the replacement text to reflect current conditions +(as opposed to conditions at the time of the call), +there is an `expanding define', \csidx{edef}, which expands +everything in the replacement text, before assigning it to the +control sequence. + +\begin{example}\begin{verbatim} +\edef\modedef{This macro was defined in + `\ifvmode vertical\else \ifmmode math + \else horizontal\fi\fi' mode} +\end{verbatim} +The mode tests will be executed at definition time, so the +replacement text will be a single string. + +As a more useful example, suppose that in a file that will be +\cs{input} the category code of the~\n@ will be changed. +One could then write +\begin{verbatim} +\edef\restorecat{\catcode`@=\the\catcode`@} +\end{verbatim} +at the start, and +\begin{verbatim} +\restorecat +\end{verbatim} +at the end. See page~\pageref{store:cat} +for a fully worked-out version of this. +\end{example} + +Contrary to the `one step expansion' of +\cs{expandafter}, the expansion inside an \cs{edef} is complete: +it goes on +until only unexpandable character and control sequence +tokens remain. +There are two exceptions to this total expansion: +\begin{itemize} \item any control sequence preceded by \cs{noexpand} +is not expanded, and, +\item if \cs{sometokenlist} is a token list, the expression +\begin{verbatim} +\the\sometokenlist +\end{verbatim} +is expanded to the contents +of the list, but the contents are not expanded +any further (see Chapter~\ref{token} for examples).\end{itemize} + +On certain occasions the \cs{edef} can conveniently be +abused, in the sense that one is not interested in defining +a control sequence, but only in the result of the expansion. +For example, with the definitions +\alt +\begin{verbatim} +\def\othermacro{\ifnum1>0 {this}\else {that}\fi} +\def\somemacro#1{ ... } +\end{verbatim} +the call\begin{verbatim} +\expandafter\somemacro\othermacro +\end{verbatim} +gives the parameter assignment +\begin{verbatim} +#1<-\ifnum +\end{verbatim} +This can be repaired by calling +\begin{verbatim} +\edef\next{\noexpand\somemacro\othermacro}\next +\end{verbatim} +Conditionals are completely expanded inside an \cs{edef}, +so the replacement text of \cs{next} will consist of the sequence +\begin{verbatim} +\somemacro{this} +\end{verbatim} +and a~subsequent call to \cs{next} executes this statement. + + +%\spoint \cs{afterassignment} +\subsection{\protect\cs{afterassignment}} +\label{sec:afterassignment} + +The \cstoidx afterassignment\par\ command +takes one token and sets it aside for insertion +in the token stream +after the next assignment or macro definition. +If the first assignment is of a~box + to a box register, +the token will be inserted right after the opening +\alt +brace of the box (see page~\pageref{every:box:assign}). + +Only one token can be saved this way; a subsequent token +saved by \cs{afterassignment} will override the first. + +Let us consider an example of the use of \cs{afterassignment}. +It is often desirable to have a macro that will +\begin{itemize} \item assign the argument to some variable, and then +\item do a little calculation, based on the new value +of the variable.\end{itemize} +The following example illustrates the +straightforward approach: +\begin{verbatim} +\def\setfontsize#1{\thefontsize=#1pt\relax + \baselineskip=1.2\thefontsize\relax} +\setfontsize{10} +\end{verbatim} +A more elegant solution is possible using \cs{afterassignment}: +\begin{verbatim} +\def\setbaselineskip + {\baselineskip=1.2\thefontsize\relax} +\def\fontsize{\afterassignment\setbaselineskip + \thefontsize} +\fontsize=10pt +\end{verbatim} +Now the macro looks like an assignment: the equals sign +is even optional. In reality its expansion +ends with a variable to be assigned to. The control sequence +\cs{setbaselineskip} is saved for execution after +the assignment to \cs{thefontsize}. + +Examples of \cs{afterassignment} in plain \TeX\ are +the \cs{magnification} and \cs{hglue} macros. +See \cite{Maus} for another creative application of +this command. + +%\spoint \cs{aftergroup} +\subsection{\protect\cs{aftergroup}} + +Several tokens can be saved for insertion after the current +\cstoidx aftergroup\par +group with an \begin{disp}\cs{aftergroup}\gr{token}\end{disp} command. +The tokens are inserted after the group in the sequence +the \cs{aftergroup} commands were given in. +The group can be delimited either by implicit or explicit +braces, or by \cs{begingroup} and \cs{endgroup}. + +\begin{example}\begin{verbatim} +{\aftergroup\a \aftergroup\b} +\end{verbatim} +is equivalent to \begin{verbatim} +\a \b +\end{verbatim} +\end{example} + +This command has many applications. One can be found +\alt +in the \cs{textvcenter} macro on page~\pageref{text:vcenter}; +another one is provided +by the footnote mechanism of plain \TeX. + +The footnote command of plain \TeX\ has the layout +\label{footnote:ex} +\begin{disp}\cs{footnote}\gr{footnote symbol}\lb\gr{footnote text}\rb +\end{disp} which looks like a macro with two arguments. +However, it is undesirable to scoop up the footnote text, +since this precludes for +instance category code changes in the footnote. + +What happens in the plain footnote macro is (globally) the following. +\begin{itemize}\item The \cs{footnote} command opens +an insert, \begin{verbatim} +\def\footnote#1{ ...#1... %treat the footnote sign + \insert\footins\bgroup +\end{verbatim} +\item In the insert box a group is opened, +and an \cs{aftergroup} command +is given to close off the insert properly: +\begin{verbatim} + \bgroup\aftergroup\@foot +\end{verbatim} +This command is meant to wind up after the closing brace of +the text that the user typed to end the footnote text; +the opening brace of the user's footnote text must +be removed by +\begin{verbatim} + \let\next=}%end of definition \footnote +\end{verbatim} +which assigns the next token, the brace, to \cs{next}. +\item The footnote text is set as ordinary text +in this insert box. +\item After the footnote the command \cs{@foot} +defined by \begin{verbatim} +\def\@foot{\strut\egroup} +\end{verbatim} +will be executed.\end{itemize} + + +%\point Preventing expansion +\section{Preventing expansion} + +Sometimes it is necessary to prevent expansion in a place +where it normally occurs. For this purpose the control +sequences \csidx{string} and \csidx{noexpand} are available. + +The use of \cs{string} is rather limited, since it converts +a control sequence token into a string of characters, with +the value of \cs{escapechar} used for the character of +category code~0. It is eminently suitable for use in a +\cs{write}, in order to output a control sequence name +(see also Chapter~\ref{io}); for another application see +the explanation of \cs{newif} in Chapter~\ref{if}. + +All characters resulting from \cs{string} have category +code~12, `other', except for space characters; they receive +code~10. See also Chapter~\ref{char}. + +%\spoint \cs{noexpand} +\subsection{\protect\cs{noexpand}} + +The \cs{noexpand} command is expandable, and its expansion +is the following token. The meaning of that token is +made temporarily equal to \cs{relax}, so that it cannot +be expanded further. + +For \cs{noexpand} the most important application is probably +in \cs{edef} commands (but in write statements it can often +replace \cs{string}). Consider as an example +\begin{verbatim} + \edef\one{\def\noexpand\two{\the\prevdepth}} +\end{verbatim} +Without the \cs{noexpand}, \TeX\ would try to expand +\cs{two}, thus giving an `undefined control sequence' error. + +A (rather pointless) +illustration of the fact that \cs{noexpand} makes the following +token effectively into a \cs{relax} is +\begin{verbatim} +\def\a{b} +\noexpand\a +\end{verbatim} +This will not produce any output, because the +effect of the \cs{noexpand} is to make the control sequence +\cs{a} temporarily equal to \cs{relax}. + +%\spoint \cs{noexpand} and active characters +\subsection{\protect\cs{noexpand} and active characters} + +The combination \cs{noexpand}\gr{token} is +\term character !active, and \cs{noexpand}\par +equivalent to \cs{relax}, even if the token +is an active character. Thus, +\begin{verbatim} +\csname\noexpand~\endcsname +\end{verbatim} +will not be the same as~\verb>\char`\~>. +Instead it will give an error message, because +unexpandable commands \ldash such as \cs{relax} \rdash are not allowed to appear +in between \cs{csname} and \cs{endcsname}. +The solution is to use \cs{string} instead; see page~\pageref{store:cat} +for an example. + +In another context, however, the sequence +\cs{noexpand}\gr{active character} is equivalent +to the character, but in unexpandable form. This is +when the conditionals \cs{if} and \cs{ifcat} are used +(for an explanation of these, see Chapter~\ref{if}). +Compare +\begin{verbatim} +\if\noexpand~\relax % is false +\end{verbatim} +where the character code of the tilde is tested, with +\begin{verbatim} +\def\a{ ... } \if\noexpand\a\relax % is true +\end{verbatim} +where two control sequences are tested. + +%\point \cs{relax} +\section{\protect\cs{relax}} + +The control sequence \csidx{relax} cannot be expanded, but +when it is executed nothing happens. + +This statement sounds a bit paradoxical, so consider +an example. Let counters \begin{verbatim} +\newcount\MyCount +\newcount\MyOtherCount \MyOtherCount=2 +\end{verbatim} +be given. +In the assignment \begin{verbatim} +\MyCount=1\number\MyOtherCount3\relax4 +\end{verbatim} +the command \cs{number} is expandable, and \cs{relax} is not. +When \TeX\ constructs the number that is to be assigned +it will expand all commands, either until a non-digit is +found, or until an unexpandable command is encountered. +Thus it reads the~\n1; it expands the sequence \verb>\number\MyOtherCount>, +which gives~\n2; it reads the~\n3; it sees the \cs{relax}, and +as this is unexpandable it halts. The number to be assigned +is then \n{123}, and the whole call has been expanded into +\begin{verbatim} +\MyCount=123\relax4 +\end{verbatim} +Since the \cs{relax} token has no effect when it is executed, +the result of this line is that \n{123} is assigned to +\cs{MyCount}, and the digit 4 is printed. + +Another example of how \cs{relax} can be used to indicate +the end of a command\label{fil:l:l}\ is +\begin{verbatim} +\everypar{\hskip 0cm plus 1fil } +\indent Later that day, ... +\end{verbatim} +This will be misunderstood: \TeX\ will see +\begin{verbatim} +\hskip 0cm plus 1fil L +\end{verbatim} +and \hbox{\n{fil L}} is a~valid, +if bizarre, +way of writing \n{fill} (see Chapter~\ref{gramm}). +One remedy is to write +\begin{verbatim} +\everypar{\hskip 0cm plus 1fil\relax} +\end{verbatim} + +%\spoint[relax:cs] \cs{relax} and \cs{csname} +\subsection{\cs{relax} and \cs{csname}} +\label{relax:cs} + +If a \verb-\csname ... \endcsname- command forms the name +of a previously undefined control sequence, +that control sequence is made equal to \cs{relax}, +and the whole statement is also equivalent to \cs{relax} +(see also page~\pageref{cs:name}). + +However, this assignment of \cs{relax} is +\altt +only local: +\begin{verbatim} +{\xdef\test{\expandafter\noexpand\csname xx\endcsname}} +\test +\end{verbatim} +gives an error message for an +undefined control sequence~\cs{xx}. + +Consider as an example the \LaTeX\ environments, +which are delimited by \begin{verbatim} +\begin{...} ... \end{...} +\end{verbatim} +The begin and end commands are (in essence) +defined as follows: +\begin{verbatim} +\def\begin#1{\begingroup\csname#1\endcsname} +\def\end#1{\csname end#1\endcsname \endgroup} +\end{verbatim} +Thus, for the list environment the commands +\cs{list} and \cs{endlist} are defined, but any +command can be used as an environment name, +even if no corresponding \cs{end...} has been defined. +For instance, \begin{verbatim} +\begin{it} ... \end{it} +\end{verbatim} +is equivalent to +\begin{verbatim} +\begingroup\it ... \relax\endgroup +\end{verbatim} +See page~\pageref{begin:end:macros} for the rationale +behind using \cs{begingroup} and \cs{endgroup} +instead of \cs{bgroup} and \cs{egroup}. + +%\spoint Preventing expansion with \cs{relax} +\subsection{Preventing expansion with \cs{relax}} + +Because \cs{relax} +cannot be expanded, a control sequence can be prevented +from being expanded (for instance in an \cs{edef} or a \cs{write}) +by making it temporarily equal to \cs{relax}: +\begin{verbatim} +{\let\somemacro=\relax \write\outfile{\somemacro}} +\end{verbatim} +will write the string `\cs{somemacro}' to an output file. +It would write the expansion +of the macro \cs{somemacro} (or give an error message +if the macro is undefined) if the \cs{let} statement +had been omitted. + +%\spoint[bump:relax] \TeX\ inserts a \cs{relax} +\subsection{\TeX\ inserts a \cs{relax}} +\label{bump:relax} + +\TeX\ itself inserts \cs{relax} on some occasions. +For instance, \cs{relax} is inserted if \TeX\ encounters an +\cs{or}, \cs{else}, or~\cs{fi} while still determining +the extent of the test. +\begin{example} +\begin{verbatim} +\ifvoid1\else ... \fi +\end{verbatim} +is changed into +\begin{verbatim} +\ifvoid1\relax \else ...\fi +\end{verbatim} +internally. +\end{example} + +Similarly, if one of the tests \cs{if}, \cs{ifcat} +is given only one comparand, as in \begin{verbatim} +\if1\else ... +\end{verbatim} +a \cs{relax} token is inserted. Thus this test +is equivalent to \begin{verbatim} +\if1\relax\else ... +\end{verbatim} + +Another place where \cs{relax} is used is the following. +While a control sequence is being defined in a \gr{shorthand +definition} \ldash that is, a \gr{registerdef} or \cs{chardef} +or \cs{mathchardef} \rdash its meaning is temporarily made +equal to \cs{relax}. This makes it possible to write +\verb>\chardef\foo=123\foo>. + +%\spoint The value of non-macros; \cs{the} +\subsection{The value of non-macros; \cs{the}} + +Expansion is a precisely defined activity in \TeX. +\cstoidx the\par +The full list of tokens that can be expanded +was given above. +Other tokens than those in the above list may have an `expansion' +in an informal sense. For instance one may wish to `expand' +the \cs{parindent} into its value, say~\n{20pt}. + +Converting the value of (among others) an +\gr{integer parameter}, a \gr{glue parameter}, +\gr{dimen parameter} or a \gr{token parameter} +into a string of character tokens is done by the expansion processor. +The command \cs{the} +is expanded whenever expansion is not inhibited, +and it takes the value of various sorts of parameters. +Its result (in most cases) +is a string of tokens of category~12, except +that spaces have category code~10. + +Here is the list of everything that can be prefixed with \cs{the}. +\begin{description}\item [\gr{parameter} or \gr{register}] +If the parameter or register is of type integer, glue, dimen +or muglue, +its value is given as a string of character tokens; +if it is of type token list (for instance +\cs{everypar} or \cs{toks5}), the result is a string of tokens. +Box registers are excluded here. +\item [\gr{codename}\gr{8-bit number}] +See page~\pageref{codename}. +\item [\gr{special register}] +The integer registers \cs{prevgraf}, \cs{deadcycles}, \cs{insertpenalties} +\cs{inputlineno}, \cs{badness}, \cs{parshape}, \cs{spacefactor} +(only in horizontal mode), or \cs{prevdepth} (only in vertical mode). +The dimension registers \cs{pagetotal}, \cs{pagegoal}, \cs{pagestretch}, +\cs{pagefilstretch}, \cs{pagefillstretch}, \cs{pagefilllstretch}, +\cs{pageshrink}, or \cs{pagedepth}. +\item [Font properties:] +\cs{fontdimen}\gr{parameter number}\gr{font}, +\cs{skew\-char}\gr{font}, +\cs{hy\-phen\-char}\gr{font}. +\item [Last quantities:] +\cs{lastpenalty}, \cs{lastkern}, \cs{lastskip}. +\item [\gr{defined character}] +Any control sequence defined by \cs{chardef} or \cs{mathchardef}; +the result is the decimal value. +\end{description} +In some cases \cs{the} can give a control sequence token +or list of such tokens. +\begin{description}\item [\gr{font}] +The result is the control sequence that stands for the +font. +\item [\gr{token variable}] +Token list registers and \gr{token parameter}s can be prefixed +with \cs{the}; the result is their contents. +\end{description} + +Let us consider an example of the use of \cs{the}. +If in a file that is to be \cs{input} the +category code of a character, say the at~sign, is changed, +one could write +\begin{verbatim} +\edef\restorecat{\catcode`@=\the\catcode`@} +\end{verbatim} +and call \cs{restorecat} at the end of the file. +If the category code was~11, \cs{restorecat} +is defined equivalent to \begin{verbatim} +\catcode`@=11 +\end{verbatim} +See page~\pageref{store:cat} for more elaborate macros +for saving and restoring catcodes. + + +%\point Examples +\section{Examples} + +%\spoint Expanding after +\subsection{Expanding after} + +The most obvious use of \cs{expandafter} is to reach over +a control sequence: +\begin{verbatim} +\def\stepcounter + #1{\expandafter\advance\csname + #1:counter\endcsname 1\relax} +\stepcounter{foo} +\end{verbatim} +Here the \cs{expandafter} lets the \cs{csname} command form +the control sequence \cs{foo:counter}; after \cs{expandafter} +is finished the statement has reduced to +\begin{verbatim} +\advance\foo:counter 1\relax +\end{verbatim} +It is possible to reach over tokens other than control sequences: in +\begin{verbatim} +\uppercase\expandafter{\romannumeral \year} +\end{verbatim} +it expands \cs{romannumeral} on the other side of the opening +brace. + +You can expand after two control sequences: +\begin{verbatim} +\def\globalstepcounter + #1{\expandafter\global\expandafter\advance + \csname #1:counter\endcsname 1\relax} +\end{verbatim} +If you think of \cs{expandafter} as reversing the evaluation +order of {\sl two\/} control sequences, you can reverse +{\sl three\/} by +\begin{verbatim} +\expandafter\expandafter\expandafter\a\expandafter\b\c +\end{verbatim} +which reaches across the three control sequences +\begin{verbatim} + \expandafter \a \b +\end{verbatim} +to expand \cs{c} first. + +There is even an unexpected use for \cs{expandafter} in +conditionals; +with \begin{verbatim} +\def\bold#1{{\bf #1}} +\end{verbatim} +the sequence \begin{verbatim} +\ifnum1>0 \bold \fi {word} +\end{verbatim} +will not give a boldface `word', but +\begin{verbatim} +\ifnum1>0 \expandafter\bold \fi {word} +\end{verbatim} +will. +The \cs{expandafter} lets \TeX\ see the \cs{fi} and remove it +before it tackles the macro \cs{bold} +(see also page~\pageref{after:cond}). + +%\spoint Defining inside an \cs{edef} +\subsection{Defining inside an \cs{edef}} + +There is one \TeX\ command that is executed instead of +expanded that is worth pointing out explicitly: +the primitive command \cs{def} (and all other \gr{def} commands) +is not expanded. + +Thus the call +\begin{verbatim} +\edef\next{\def\thing{text}} +\end{verbatim} +will give an `undefined +control sequence' for \cs{thing}, even though after +\cs{def} expansion is ordinarily inhibited (see page~\pageref{noexp:list}). +After \begin{verbatim} +\edef\next{\def\noexpand\thing{text}} +\end{verbatim} +the `meaning' of \cs{next} will be \begin{verbatim} +macro: \def \thing {text} +\end{verbatim} +The definition \begin{verbatim} +\edef\next{\def\noexpand\thing{text}\thing} +\end{verbatim} +will again give an `undefined control sequence' for \cs{thing} +(this time on its second occurrence), +as it will only be defined when \cs{next} is called, +not when \cs{next} is defined. + + +%\spoint[expand:write] Expansion and \cs{write} +\subsection{Expansion and \cs{write}} +\label{expand:write} + +The argument token list of \csidx{write} is treated in much +the same way as the replacement text of an \cs{edef}; +that is, expandable control sequences and active characters +are completely expanded. Unexpandable control sequences +are treated by \cs{write} as if they are prefixed +by \cs{string}. + +Because of the expansion performed by \cs{write}, +some care has to be taken when outputting control +sequences with \cs{write}. +Even more complications arise from the fact that +the expansion of the argument of \cs{write} is only performed +when it is shipped out. Here follows a worked-out +example. + +Suppose \cs{somecs} is a macro, and you +want to write the string +\begin{disp}\verb-\def\othercs-\lb {\italic the expansion of \cs{somecs}}\rb +\end{disp} +to a file. + +The first attempt is +\begin{verbatim} +\write\myfile{\def\othercs{\somecs}} +\end{verbatim} +This gives an error `undefined control sequence' for \cs{othercs}, +\altt +because the \cs{write} will try to expand that token. +Note that the \cs{somecs} is also expanded, +so that part is right. + +The next attempt is +\begin{verbatim} +\write\myfile{\def\noexpand\othercs{\somecs}} +\end{verbatim} +This is almost right, but not quite. The +statement written is +\begin{disp}\verb>\def\othercs>\lb{\italic expansion of \cs{somecs}}\rb\end{disp} +which looks right. + +However, writes \ldash and the expansion of their argument \rdash +are not executed +on the spot, but saved until the part of the page on which +they occur is shipped out (see Chapter~\ref{io}). +So, in the meantime, the value of \cs{somecs} may have +changed. In other words, the value written may not be the +value at the time the \cs{write} command was given. +Somehow, therefore, the current expansion must be +inserted in the write command. + +The following is an attempt at repair: +\begin{verbatim} +\edef\act{\write\myfile{\def\noexpand\othercs{\somecs}}} +\act +\end{verbatim} +Now the write command will be +\begin{disp}\verb>\write\myfile{\def\othercs{>\italic value of\/ + \verb>\somecs}}>\end{disp} +The \cs{noexpand} prevented the \cs{edef} from expanding +the \cs{othercs}, but after the definition it has disappeared, +so that execution of the write will again give an undefined control +sequence. The final solution is +\begin{verbatim} +\edef\act{\write\myfile + {\def \noexpand\noexpand \noexpand\othercs{\somecs}}} +\act +\end{verbatim} +In this case the write command caused by the expansion of \cs{act} +will be +\begin{disp}\verb>\write\myfile{\def\noexpand\othercs>\lb + {\italic current value of \cs{somecs}}\rb\end{disp} +and the string actually written is +\begin{disp}\verb>\def\othercs>\lb + {\italic current value of \cs{somecs}}\rb\end{disp} +This mechanism is the basis for cross-referencing +macros in several macro packages. + + +%\spoint Controlled expansion inside an \cs{edef} +\subsection{Controlled expansion inside an \cs{edef}} + +Sometimes you may need an \cs{edef} to evaluate current +\howto Control expansion inside an \cs{edef}\par +conditions, but you want to expand something in the replacement +text only to a certain level. Suppose that +\begin{verbatim} +\def\a{\b} \def\b{c} \def\d{\e} \def\e{f} +\end{verbatim} +is given, and you want to define \cs{g} as \cs{a} expanded +one step, followed by \cs{d} fully expanded. The following +works: +\begin{verbatim} +\edef\g{\expandafter\noexpand\a \d} +\end{verbatim} +Explanation: the \cs{expandafter} reaches over the \cs{noexpand} +to expand \cs{a} one step, after which the +sequence \verb-\noexpand\b- is left. + +This trick comes in handy when you need to +construct a control sequence with \cs{csname} inside +an \cs{edef}. The following sequence inside an \cs{edef} +\begin{verbatim} +\expandafter\noexpand\csname name\endcsname +\end{verbatim} +will expand exactly to \cs{name}, but not further. +As an example, suppose +\begin{verbatim} +\def\condition{true} +\end{verbatim} +has been given, then +\begin{verbatim} +\edef\setmycondition{\expandafter\noexpand + \csname mytest\condition\endcsname} +\end{verbatim} +will let \cs{setmycondition} expand to \cs{mytesttrue}. + +%\spoint Multiple prevention of expansion +\subsection{Multiple prevention of expansion} + +As was pointed out above, prefixing a command with +\cs{noexpand} prevents its expansion in commands +such as \cs{edef} and~\cs{write}. However, if a sequence of tokens +passes through more than one expanding command +stronger measures are needed. + +The following trick can be used: +in order to protect a command against expansion +it can be prefixed with \csidx{protect}. +During the stages of processing where expansion is +not desired the definition of \cs{protect} is +\begin{verbatim} +\def\protect{\noexpand\protect\noexpand} +\end{verbatim} +Later on, when the command is actually needed, +\cs{protect} is defined as +\begin{verbatim} +\def\protect{} +\end{verbatim} + +Why does this work? The expansion of +\begin{verbatim} +\protect\somecs +\end{verbatim} +is at first +\begin{verbatim} +\noexpand\protect\noexpand\somecs +\end{verbatim} +Inside an \cs{edef} this sequence is expanded further, +and the subsequent expansion is +\begin{verbatim} +\protect\somecs +\end{verbatim} +That is, the expansion is equal to the original sequence. + + +%\spoint More examples with \cs{relax} +\subsection{More examples with \cs{relax}} + +Above, a first example was given in which \cs{relax} served +to prevent \TeX\ from scanning too far. +Here are some more examples, using \cs{relax} to bound +numbers. + +After +\begin{verbatim} +\countdef\pageno=0 \pageno=1 +\def\Par{\par\penalty200} +\end{verbatim} +the sequence \begin{verbatim} +\Par\number\pageno +\end{verbatim} +is misunderstood as +\begin{verbatim} +\par\penalty2001 +\end{verbatim} +In this case it is sufficient to define +\begin{verbatim} +\def\Par{\par\penalty200 } +\end{verbatim} +as an \gr{optional space} is allowed to follow a number. + +Sometimes, however, such a simple escape is not possible. +Consider the definition +\begin{verbatim} +\def\ifequal#1#2{\ifnum#1=#2 1\else 0\fi} +\end{verbatim} +The question is whether the space after \verb-#2- +is necessary, superfluous, or simply wrong. +Calls such as \verb-\ifequal{27}{28}- that compare two +numbers (denotations) will correctly give \n1 or~\n0, +and the space is necessary to prevent misinterpretation. + +However, \verb-\ifequal\somecounter\othercounter- will +give \n{\char 32 1} if the counters are equal; in this +case the space could have been dispensed with. +The solution that works in both cases is +\begin{verbatim} +\def\ifequal#1#2{\ifnum#1=#2\relax 1\else 0\fi} +\end{verbatim} +Note that \cs{relax} is not expanded, so +\begin{verbatim} +\edef\foo{1\ifequal\counta\countb} +\end{verbatim} +will define \cs{foo} as either \verb-1\relax1- or~\n{10}. + +%\spoint[store:cat] Example: category code saving and restoring +\subsection{Example: category code saving and restoring} +\label{store:cat} + +In many applications it is necessary to change +\howto Save and restore category codes\par +the category code of a certain character during the +execution of some piece of code. If the writer of +that code is also the writer of the surrounding code, +s/he can simply change the category code back and forth. +However, if the surrounding code is by another author, +the value of the category code will have to be stored +and restored. + +Thus one would like to write +\begin{verbatim} +\storecat@ +... some code ... +\restorecat@ +\end{verbatim} +or maybe \begin{verbatim} +\storecat\% +\end{verbatim} +for characters that +are possibly a comment character (or ignored or invalid). +\alt +The basic idea is to define +\begin{verbatim} +\def\storecat#1{% + \expandafter\edef\csname restorecat#1\endcsname + {\catcode`#1=\the\catcode`#1}} +\end{verbatim} +so that, for instance, \verb>\storecat$> will define +the single control sequence `\verb>\restorecat$>' +(one control sequence) as \begin{verbatim} +\catcode`$=3 +\end{verbatim} +The macro \cs{restorecat} can then be implemented as +\begin{verbatim} +\def\restorecat#1{% + \csname restorecat#1\endcsname} +\end{verbatim} +Unfortunately, things are not so simple. + +The problems occur with active characters, because these +are expanded inside the \verb>\csname ... \endcsname> pairs. +One might be tempted to write \verb>\noexpand#1> everywhere, +but this is wrong. As was explained above, this is essentially +equal to \cs{relax}, which is unexpandable, and will therefore +lead to an error message when it appears between +\cs{csname} and \cs{endcsname}. The proper solution is then +to use \verb>\string#1>. For the case where the argument +was given as a control symbol (for example~\verb>\%>), +the escape character has to be switched off for a while. + +Here are the complete macros. The \cs{storecat} macro +gives its argument a default category code of~12. +\begin{verbatim} +\newcount\tempcounta % just a temporary +\def\csarg#1#2{\expandafter#1\csname#2\endcsname} +\def\storecat#1% + {\tempcounta\escapechar \escapechar=-1 + \csarg\edef{restorecat\string#1}% + {\catcode`\string#1= + \the\catcode\expandafter`\string#1}% + \catcode\expandafter`\string#1=12\relax + \escapechar\tempcounta} +\def\restorecat#1% + {\tempcounta\escapechar \escapechar=-1 + \csname restorecat\string#1\endcsname + \escapechar\tempcounta} +\end{verbatim} + +%\spoint Combining \cs{aftergroup} and boxes +\subsection{Combining \cs{aftergroup} and boxes} + +%\tracingmacros=2 \tracingcommands=2 +At times, one wants to construct a box and immediately +after it has been constructed to +do something with it. The \cs{aftergroup} command +can be used to put both the commands creating the box, +and the ones handling it, in one macro. + +As an example, here is a macro +\cs{textvcenter}\label{text:vcenter}\ +which defines a variant of the \cs{vcenter} box +\howto \cs{vcenter} outside math mode\par +(see page~\pageref{vcenter}\label{tvcenter}) +that can be used outside math mode. +\begin{verbatim} +\def\textvcenter + {\hbox \bgroup$\everyvbox{\everyvbox{}% + \aftergroup$\aftergroup\egroup}\vcenter} +\end{verbatim} +The idea is that the macro inserts \verb>\hbox {$>, +and that the matching \verb>$}> gets inserted +by the \cs{aftergroup} commands. In order to get the +\cs{aftergroup} commands inside the box, an +\cs{everyvbox} command is used. + +This macro can even be used with a \gr{box specification} +(see page~\pageref{box:spec}), for example +\begin{verbatim} +\textvcenter spread 8pt{\hbox{a}\vfil\hbox{b}} +\end{verbatim} +and because it is really just an \cs{hbox}, it can also +be used in a \cs{setbox} assignment. + +%\spoint More expansion +\subsection{More expansion} + +There is a particular charm to macros that work +purely by expansion. See the articles by +\cite{E2}, \cite{Jeffrey:lists}, and~\cite{Maus2}. + +%%%% end of input file [expand] + +%\InputFile:ifelsefi +%%%% this is input file [ifelsefi] +%\subject[if] Conditionals +\endofchapter +\chapter{Conditionals}\label{if} + +Conditionals are an indispensible tool for powerful macros. +\term conditional\par +\TeX\ has a large repertoire of conditionals for querying +such things as category codes or processing modes. +This chapter gives an inventory of the various conditionals, +and it treats the evaluation of +conditionals in detail. + +\begin{inventory} +\item [\cs{if}] + Test equality of character codes. + +\item [\cs{ifcat}] + Test equality of category codes. + +\item [\cs{ifx}] + Test equality of macro expansion, or equality of character code and + category code. + +\item [\cs{ifcase}] + Enumerated case statement. + +\item [\cs{ifnum}] + Test relations between numbers. + +\item [\cs{ifodd}] + Test whether a number is odd. + +\item [\cs{ifhmode}] + Test whether the current mode is (possibly restricted) horizontal mode. + +\item [\cs{ifvmode}] + Test whether the current mode is (possibly internal) vertical mode. + +\item [\cs{ifmmode}] + Test whether the current mode is (possibly display) math mode. + +\item [\cs{ifinner}] + Test whether the current mode is an internal mode. + +\item [\cs{ifdim}] + Compare two dimensions. + +\item [\cs{ifvoid}] + Test whether a box register is empty. + +\item [\cs{ifhbox}] + Test whether a box register contains a horizontal box. + +\item [\cs{ifvbox}] + Test whether a box register contains a vertical box. + +\item [\cs{ifeof}] + Test for end of input stream or non-existence of file. + +\item [\cs{iftrue}] + A test that is always true. +\item [\cs{iffalse}] + A test that is always false. +\item [\cs{fi}] + Closing delimiter for all conditionals. + +\item [\cs{else}] + Select \gr{false text} of a conditional + or default case of \cs{ifcase}. + +\item [\cs{or}] + Separator for entries of an \cs{ifcase}. + +\item [\cs{newif}] + Create a new test. + +\end{inventory} + +%\point The shape of conditionals +\section{The shape of conditionals} + +Conditionals in \TeX\ have one of the following two forms +\cstoidx else\par\cstoidx fi\par +\begin{disp}\cs{if...}\gr{test tokens}\gr{true text}\cs{fi}\nl + \cs{if...}\gr{test tokens}\gr{true text}\cs{else}% + \gr{false text}\cs{fi}\end{disp} +where the \gr{test tokens} are zero or more tokens, depending on +the particular conditional; the \gr{true text} is a series of tokens +to be processed if the test turns out true, and the \gr{false text} +is a series of tokens to be processed if the test turns out false. +Both the \gr{true text} and the \gr{false text} can be empty. + +The exact process of how \TeX\ expands conditionals is treated +below. + +%\point Character and control sequence tests +\section{Character and control sequence tests} + +Three tests exist for testing character tokens and +control sequence tokens. + +%\spoint \cs{if} +\subsection{\cs{if}} + +Equality of character codes can be tested by +\cstoidx if\par +\begin{Disp}\cs{if}\gr{token$_1$}\gr{token$_2$}\end{Disp} +In order to allow the tokens to be control sequences, +\TeX\ assigns character code~256 to control sequences, +the lowest positive number that is not the character code of a +character token (remember that the legal character codes +are~0--255). + +Thus all control sequences are equal as far as \cs{if} is +concerned, and they are unequal to all character tokens. +As an example, this fact can be used to define +\howto Test whether a token is a control sequence\par +\begin{verbatim} +\def\ifIsControlSequence#1{\if\noexpand#1\relax} +\end{verbatim} +which tests whether a token is a control sequence token +instead of a character token (its result is unpredictable +if the argument is a \verb>{...}> group). + +After \cs{if} \TeX\ will expand until two unexpandable +tokens are obtained, so it is necessary to prefix +expandable control sequences and active characters +with \cs{noexpand} when testing them with~\cs{if}. + +\begin{example} After +\begin{verbatim} +\catcode`\b=13 \catcode`\c=13 \def b{a} \def c{a} \let\d=a +\end{verbatim} +we find that +\begin{tdisp} +\verb-\if bc- is true, because both \n b and \n c expand to \n a,\nl +\verb-\if\noexpand b\noexpand c- is false, and\nl +\verb-\if b\d- is true because \n{b} expands to the character~\n{a}, + and \cs{d} is an implicit character token~\n{a}. +\end{tdisp} +\end{example} + +%\spoint \cs{ifcat} +\subsection{\cs{ifcat}} + +The \cs{if} test ignores category codes; these can be tested +\cstoidx ifcat\par +by \begin{Disp}\cs{ifcat}\gr{token$_1$}\gr{token$_2$}\end{Disp} + +This test is a lot like \cs{if}: \TeX\ expands after it +until unexpandable tokens remain. For this test +control sequences +are considered to have category code~16 +(ordinarily, category codes are in the range~0--15), which makes them +all equal to each other, and different from all character +tokens. + +%\spoint \cs{ifx} +\subsection{\protect\cs{ifx}} + +Equality of tokens is tested in a stronger sense than +\cstoidx ifx\par +the above by \begin{Disp}\cs{ifx}\gr{token$_1$}\gr{token$_2$}\end{Disp} + +\begin{itemize}\item Character tokens are equal for \cs{ifx} if +they have the same character code and category code. + \item Control sequence tokens are equal if they represent the +same \TeX\ primitive, or have been similarly defined by +\cs{font}, \cs{countdef}, or some such. For example, +\begin{verbatim} +\let\boxhor=\hbox \ifx\boxhor\hbox %is true +\font\a=cmr10 \font\b=cmr10 \ifx\a\b %is true +\end{verbatim} +\item Control sequences are also equal if they are +macros with the same parameter text and replacement text, +and the same status with respect to \cs{outer} and~\cs{long}. +For example, +\begin{verbatim} +\def\a{z} \def\b{z} \def\c1{z} \def\d{\a} +\ifx\a\b %is true +\ifx\a\c %is false +\ifx\a\d %is false +\end{verbatim} +\end{itemize} + +Tokens following this test are not expanded. + +By way of example of the use of \cs{ifx} consider string testing. +A simple implementation of string testing in \TeX\ is as follows: +\begin{verbatim} +\def\ifEqString#1#2{\def\testa{#1}\def\testb{#2}% + \ifx\testa\testb} +\end{verbatim} +The two strings are used as the replacement text of two macros, +and equality of these macros is tested. +This is about as efficient as string testing can get: +\TeX\ will traverse the definition texts of the +macros \cs{testa} and \cs{testb}, which has precisely the +right effect. + +As another example, one can test whether a control sequence is defined +by\howto Test whether a control sequence is (un)defined\par +\begin{verbatim} +\def\ifUnDefinedCs#1{\expandafter + \ifx\csname#1\endcsname\relax} +\ifUnDefinedCs{parindent} %is not true +\ifUnDefinedCs{undefined} %is (one hopes) true +\end{verbatim} +This uses the fact that a \verb>\csname...\endcsname> command +is equivalent to \cs{relax} if the control sequence +has not been defined before. Unfortunately, this test also +turns out true if a control sequence has been \cs{let} to +\cs{relax}. + +%\point Mode tests +\section{Mode tests} + +In order to determine in which of the six modes +(see Chapter~\ref{hvmode}) \TeX\ +is currently operating, the tests \csidx{ifhmode}, +\csidx{ifvmode}, \csidx{ifmmode}, and~\csidx{ifinner} +are available. + +\begin{itemize}\item\cs{ifhmode} is true if \TeX\ is in horizontal mode +or restricted horizontal mode. +\item\cs{ifvmode} is true if \TeX\ is in vertical mode or +internal vertical mode. +\item\cs{ifmmode} is true if \TeX\ is in math mode or display +math mode.\end{itemize} + +The \cs{ifinner} test is true if \TeX\ is in any of the three +internal modes: restricted horizontal mode, internal vertical +mode, and non-display math mode. + +%\point Numerical tests +\section{Numerical tests} + +Numerical relations between \gr{number}s can be tested +\cstoidx ifnum\par +with \begin{disp}\cs{ifnum}\gr{number$_1$}\gr{relation}% +\gr{number$_2$}\end{disp} +where the relation is a character \n{<}, \n{=}, or~\n{>}, +of category~12. + +Quantities such as glue can be used as a number here +through the conversion to scaled points, and \TeX\ +will expand in order to arrive at the two \gr{number}s. + +Testing for odd or even numbers can be done with \csidx{ifodd}: +the test\begin{disp}\cs{ifodd}\gr{number}\end{disp} +is true if the \gr{number} is odd. + +%\point Other tests +\section{Other tests} + +%\spoint Dimension testing +\subsection{Dimension testing} + +Relations between \gr{dimen} values (Chapter~\ref{glue}) +can be tested with +\csidx{ifdim} using the same three relations as in \cs{ifnum}. + +%\spoint Box tests +\subsection{Box tests} + +Contents of box registers (Chapter~\ref{boxes}) can be tested with +\cstoidx ifhbox\par\cstoidx ifvbox\par\cstoidx ifvoid\par +\begin{disp}\cs{ifvoid}\gr{8-bit number}\end{disp} +which is true if the register contains no box, +\begin{disp}\cs{ifhbox}\gr{8-bit number}\end{disp} +which is true if the register contains a horizontal box, and +\begin{disp}\cs{ifvbox}\gr{8-bit number}\end{disp} +which is true if the register contains a vertical box. + +%\spoint I{/}O tests +\subsection{I{/}O tests} + +The status of input streams (Chapter~\ref{io}) can be tested with +\cstoidx ifeof\par +the end-of-file test +\cs{ifeof}\gr{number}, which is only false +if the number is in the range 0--15, and the corresponding +stream is open and not fully read. In particular, this test +is true if the file name connected +to this stream (through \cs{openin}) +does not correspond to an existing file. +See the example on page~\pageref{ex:eof}. + +%\spoint Case statement +\subsection{Case statement} + +The \TeX\ case statement is called \cs{ifcase}; +\cstoidx ifcase\par\cstoidx or\par +its syntax is\begin{disp}\cs{ifcase}\gr{number}\gr{case$_0$}\cs{or}% +\n{...}\cs{or}\gr{case$_n$}\cs{else}\gr{other cases}\cs{fi} +\end{disp} where for $n$ cases there are $n-1$ \cs{or} +control sequences. Each of the \gr{case$_i$} +parts can be empty, +and the \cs{else}\gr{other cases} part is optional. + +%\spoint Special tests +\subsection{Special tests} + +The tests \cs{iftrue} and \cs{iffalse} are always +\cstoidx iftrue\par\cstoidx iffalse\par +true and false respectively. +They are mainly useful as tools in macros. + +For instance, the sequences \begin{verbatim} +\iftrue{\else}\fi +\end{verbatim} +and \begin{verbatim} +\iffalse{\else}\fi +\end{verbatim} +yield a left and right +brace respectively, but they have balanced braces, so they +can be used inside a macro replacement text. + +The \cs{newif} macro, treated below, +provides another use of \cs{iftrue} and \cs{iffalse}. +On page 260 of \TeXbook\ these control sequences +are also used in an interesting manner. + +%\point[newif:def] The \cs{newif} macro +\section{The \protect\cs{newif} macro} +\label{newif:def} + +The plain format defines an (outer) macro \csidx{newif} by +which the user can define new conditionals. +If the user defines \begin{verbatim} +\newif\iffoo +\end{verbatim} +\TeX\ defines three new control sequences, +\cs{footrue} and \cs{foofalse} with which the user can set +the condition, and \cs{iffoo} which tests the `foo' condition. + +The macro call \verb-\newif\iffoo- expands to +\begin{verbatim} +\def\footrue{\let\iffoo=\iftrue} \def\foofalse{\let\iffoo=\iffalse} +\foofalse +\end{verbatim} +The actual definition, especially the part that ensures that +the \cs{iffoo} indeed starts with \cs{if}, is a pretty hack. +An explanation follows here. +This uses concepts from Chapters~\ref{macro} +and~\ref{expand}. + +The macro \cs{newif} starts as follows: +\begin{verbatim} +\outer\def\newif#1{\count@\escapechar \escapechar\m@ne +\end{verbatim} +This saves the current escape character in \cs{count@}, and +sets the value of \cs{escapechar} to~\n{-1}. +The latter action has the +effect that no escape character is used in the output +of \cs{string}\gr{control sequence}. + +An auxiliary macro \verb>\if@> is defined by +\begin{verbatim} +{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} +\end{verbatim} +Since the uppercase command changes only character codes, and +not category codes, the macro \cs{if@} now has +to be followed by the characters \n{if} of category~12. +Ordinarily, these characters have category code~11. +In effect this +macro then eats these two characters, and \TeX\ complains if +they are not present. + +Next there is a macro \verb>\@if> defined by +\begin{verbatim} +\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname} +\end{verbatim} +which will be called like \verb>\@if\iffoo{true}> and +\verb>\@if\iffoo{false}>. + +Let us examine the call \verb>\@if\iffoo{true}>. +\begin{itemize}\item The \cs{expandafter} reaches over the \verb>\if@> +to expand \cs{string} first. The part \verb>\string\iffoo> +expands to \n{iffoo} because the escape character is not printed, +and all characters have category~12. +\item The \verb>\if@> eats the first two characters +\n i$_{12}$\n f$_{12}$ of this. +\item As a result, the final expansion of \verb>\@if\iffoo{true}> +is then \begin{verbatim} +\csname footrue\endcsname +\end{verbatim} +\end{itemize} + +Now we can treat the relevant parts of \cs{newif} itself: +\begin{verbatim} +\expandafter\expandafter\expandafter + \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}% +\end{verbatim} + +The three \cs{expandafter} commands may look intimidating, so let us +take one step at a time. +\begin{itemize}\item One \cs{expandafter} is necessary to reach over the \cs{edef}, +such that \verb>\@if> will expand: +\begin{verbatim} +\expandafter\edef\@if\iffoo{true} +\end{verbatim} +gives +\begin{verbatim} +\edef\csname footrue\endcsname +\end{verbatim} +\item Then another \cs{expandafter} is necessary to activate +\altt +the \cs{csname}: +\begin{verbatim} +\expandafter \expandafter \expandafter \edef \@if ... +% new old new +\end{verbatim} +\item This makes the final expansion +\begin{verbatim} +\edef\footrue{\let\noexpand\iffoo=\noexpand\iftrue} +\end{verbatim} +\end{itemize} + +After this follows a similar statement for the \n{false} case: +\begin{verbatim} + \expandafter\expandafter\expandafter + \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}% +\end{verbatim} +The conditional starts out false, and the escape character +has to be reset: +\begin{verbatim} + \@if#1{false}\escapechar\count@} +\end{verbatim} + + +%\point Evaluation of conditionals +\section{Evaluation of conditionals} + +\TeX's conditionals behave differently from those +\term evaluation! conditionals\par\term conditionals! evaluation of\par +in ordinary programming languages. In many instances +one may not notice the difference, but in certain contexts +it is important to know precisely what happens. + +When \TeX\ evaluates a conditional, it first determines +what is to be tested. This in itself may involve some +expansion; as we saw in the previous chapter, +only after an \cs{ifx} test +does \TeX\ not expand. After all other tests \TeX\ will +expand tokens until the extent of the test and the tokens +to be tested have been determined. On the basis of the outcome +of this test the \gr{true text} and the \gr{false text} +are either expanded or skipped. + +For the processing of the parts of the conditional +let us consider some cases separately. +\begin{itemize} +\item \verb>\if... ... \fi> and the result of the test is false. + After the test \TeX\ will start skipping material + without expansion, without counting braces, but balancing + nested conditionals, until a \cs{fi} token is encountered. + If the \cs{fi} is not found an error message results + at the end of the file: + \begin{disp}\tt Incomplete \cs{if...}; all text was ignored after line \n{...} + \end{disp} where the line number indicated is that of the line + where \TeX\ started skipping, that is, where the conditional + occurred. + +\item \verb>\if... \else ... \fi> and the result of the test is false. + Any material in between the condition and the \cs{else} is skipped + without expansion, without counting braces, but balancing nested + conditionals. + + The \cs{fi} token can be the result of expansion; if it never + turns up \TeX\ will give a diagnostic message + \begin{disp}\tt \cs{end} occurred when \cs{if...} on line \n{...} + was incomplete\end{disp} + This sort of error is not visible in the output. + + This point plus the previous may jointly be described as follows: + after a false condition \TeX\ skips until an \cs{else} or \cs{fi} + is found; any material in between \cs{else} and \cs{fi} is processed. + +\item \verb>\if... ... \fi> and the result of the test is true. + \TeX\ will start processing the material following the condition. + As above, the \cs{fi} token may be inserted by expansion of + a macro. + +\item \verb>\if... \else ... \fi> and the result of the test is true. + Any material following the condition is processed until the \cs{else} + is found; then \TeX\ skips everything until the matching \cs{fi} + is found. + + This point plus the previous may be described as follows: + after a true test \TeX\ starts processing material until + an \cs{else} or \cs{fi} is found; if an \cs{else} is found + \TeX\ skips until it finds the matching \cs{fi}. +\end{itemize} + + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint The test gobbles up tokens +\subsection{The test gobbles up tokens} + +A common mistake is to write the following: +\begin{verbatim} +\ifnum\x>0\someaction \else\anotheraction \fi +\end{verbatim} +which has the effect that the \verb.\someaction. is expanded, +regardless of whether the test succeeds or not. +The reason for this is that \TeX\ evaluates the input stream until +it is certain that it has found the arguments to be tested. +In this case it is perfectly possible for the \verb.\someaction. +to yield a digit, so it is expanded. The remedy is to insert +\altt +a space or a \cs{relax} control sequence +after the last digit of the number to be tested. + +%\spoint The test wants to gobble up the \cs{else} or \cs{fi} +\subsection{The test wants to gobble up the \cs{else} or \cs{fi}} + +The same mechanism that underlies the phenomenon in the previous +point can lead to even more surprising effects if \TeX\ +bumps into an \verb.\else., \verb.\or., or \verb.\fi. +while still busy determining the extent of the test itself. + +Recall that \verb.\pageno. is a synomym for \verb.\count0., and +consider the following examples: +\begin{verbatim} +\newcount\nct \nct=1\ifodd\pageno\else 2\fi 1 +\end{verbatim} +and +\begin{verbatim} +\newcount\nct \nct=1\ifodd\count0\else 2\fi 1 +\end{verbatim} +The first example will assign either 11 or~121 to \cs{nct}, +but the second one will assign 1 or~121. +The explanation is that +in cases like the second, where +\altt +an \verb.\else. is encountered while the +test still has not been delimited, a \verb.\relax. is inserted. +In the case that \verb.\count0. is odd the result will thus be \verb.\relax., +and the example will yield \begin{verbatim} +\nct=1\relax2 +\end{verbatim} +which will assign~1 to \cs{nct}, and print~2. + + +%\spoint[after:cond] Macros and conditionals; the use of \cs{expandafter} +\subsection{Macros and conditionals; the use of \cs{expandafter}} +\label{after:cond} + +Consider the following example: +\begin{verbatim} +\def\bold#1{{\bf #1}} \def\slant#1{{\sl #1}} +\ifnum1>0 \bold \else \slant \fi {some text} ... +\end{verbatim} +This will make not only `some text', +but {\sl all\/} subsequent text bold. +Also, at the end of the job there will be a notice that +`end occurred inside a group at level~1'. +Switching on \cs{tracingmacros} reveals that the argument +of \verb.\bold. was \verb.\else.. +This means that, after expansion of \verb.\bold., +the input stream looked like +\begin{verbatim} +\ifnum1>0 {\bf \else }\fi {some text} rest of the text +\end{verbatim} +so the closing brace was skipped as part of the \gram{false text}. +Effectively, then, the resulting stream is +\begin{verbatim} +{\bf {some text} rest of the text +\end{verbatim} +which is unbalanced. + +One solution to this sort of problem would be to write +\begin{verbatim} +\ifnum1>0 \let\next=\bold \else \let\next=\slant \fi \next +\end{verbatim} +but a solution using \cs{expandafter} is also possible: +\begin{verbatim} +\ifnum1>0 \expandafter \bold \else \expandafter \slant \fi +\end{verbatim} +This works, because the \cs{expandafter} commands let \TeX\ determine +the boundaries of the \gram{true text} and the \gram{false text}. + +In fact, the second solution may be preferred over the first, +since conditionals are handled by the expansion processor, +and the \cs{let} statements are tackled only by the execution +processor; that is, they are not expandable. +Thus the second solution will (and the first will not) +work, for instance, +inside an~\cs{edef}. + +Another example with \cs{expandafter} is the sequence +\begin{verbatim} +\def\get#1\get{ ... } +\expandafter \get \ifodd1 \ifodd3 5\fi \fi \get +\end{verbatim} +This gives\begin{verbatim} +#1<- \ifodd3 5\fi \fi +\end{verbatim} +and +\begin{verbatim} +\expandafter \get \ifodd2 \ifodd3 5\fi\fi \get +\end{verbatim} +gives\begin{verbatim} +#1<- +\end{verbatim} +This illustrates again that the result of evaluating a +conditional is not the final expansion, but the start +of the expansion of the \gr{true text} or \gr{false text}, +depending on the outcome of the test. + +A detail should be noted: with \cs{expandafter} +it is possible that the \verb.\else. is encountered +before the \gram{true text} has been expanded completely. +This raises the question as to the exact timing of expansion +and skipping. +In the example +\begin{verbatim} +\def\hello{\message{Hello!}} +\ifnum1>0 \expandafter \hello \else \message{goodbye} \bye +\end{verbatim} +the error message caused by the missing \verb.\fi. is given +without \verb.\hello. ever having been expanded. +The conclusion must be that the \gram{false text} is +skipped as soon as it has been located, even if this is at a time +when the \gram{true text} has not been expanded completely. + +%\spoint Incorrect matching +\subsection{Incorrect matching} + +\TeX's matching of \verb.\if., \verb.\else., and \verb.\fi. +is easily upset. For instance, \TeXbook\ warns you that +you should not say \begin{verbatim} + \let\ifabc=\iftrue +\end{verbatim} +inside a +conditional, because if this text is skipped \TeX\ sees +at least one \verb.\if. to be matched. + +The reason for this is that when \TeX\ is skipping +it recognizes all \cs{if...}, \cs{or}, \cs{else}, and \cs{fi} +tokens, and everything that has been declared a synonym of +such a token by \cs{let}. In \verb>\let\ifabc=\iftrue> +\TeX\ will therefore at least see the \cs{iftrue} as +the opening of a conditional, and, if the current meaning +of \cs{ifabc} was for instance \cs{iffalse}, it will also +be considered as the opening of a conditional statement. + +As another example, if +\begin{verbatim} + \csname if\sometest\endcsname \someaction \fi +\end{verbatim} +is skipped as part of conditional text, +the \verb.\fi. will unintentionally close the +outer conditional. + +It does not help to enclose such potentially dangerous +constructs inside a group, because grouping is independent of +conditional structure. Burying such commands inside macros is +the safest approach. + +Sometimes another solution is possible, however. +The \cs{loop} macro of plain \TeX\ (see page~\pageref{loop:ex}) +is used as \begin{verbatim} +\loop ... \if ... \repeat +\end{verbatim} +where the \cs{repeat} is not an actually executable +command, but is merely a delimiter: +\begin{verbatim} +\def\loop#1\repeat{ ... } +\end{verbatim} +Therefore, +by declaring \begin{verbatim} +\let\repeat\fi +\end{verbatim} +the \cs{repeat} balances the \cs{if...} that terminates +the loop, and it becomes possible to have loops in +skipped conditional text. + +%\spoint Conditionals and grouping +\subsection{Conditionals and grouping} + +It has already been mentioned above that group nesting in \TeX\ +is independent of conditional nesting. +The reason for this is that conditionals are handled by the +expansion part of \TeX; in that stage braces are just +unexpandable tokens that require no special treatment. +Grouping is only performed in the later stage of execution +processing. + +An example of this independence is now given. +One may write a macro that yields part of +a conditional: +\begin{verbatim} +\def\elsepart{\else \dosomething \fi} +\end{verbatim} +The other way around, the following macros +yield a left brace and a right brace respectively: +\begin{verbatim} +\def\leftbrace{\iftrue{\else}\fi} +\def\rightbrace{\iffalse{\else}\fi} +\end{verbatim} +Note that braces in these definitions are properly nested. + +%\spoint A trick +\subsection{A trick} + +In some contexts it may be hard to get rid of +\cs{else} or \cs{fi} tokens in a proper +manner. The above approach with \cs{expandafter} +works only if there is a limited number of tokens involved. +In other cases the following trick may provide a way out: +\begin{verbatim} +\def\hop#1\fi{\fi #1} +\end{verbatim} +Using this as +\begin{disp}\verb>\if... \hop >\gr{lots of tokens}\verb>\fi>\end{disp} +will place the tokens outside the conditional. +This is for instance used in~\cite{E2}. + +As a further example of this sort of trick, +consider the problem (suggested to me and solved by +Alan Jeffrey) of implementing a conditional +\verb-\ifLessThan#1#2#3#4- +such that the arguments corresponding to \verb-#3- or +\verb-#4- result, depending on whether \verb-#1- is +less than \verb-#2- or not. + +The problem here is how to get rid of the \cs{else} and the~\cs{fi}. +The \ldash or at least, one \rdash solution is to scoop them up +as delimiters for macros: +\begin{verbatim} +\def\ifLessThan#1#2{\ifnum#1<#2\relax\taketrue \else \takefalse \fi} +\def\takefalse\fi#1#2{\fi#2} +\def\taketrue\else\takefalse\fi#1#2{\fi#1} +\end{verbatim} +Note that \cs{ifLessThan} has only two parameters +(the things to be tested); however, its +result is a macro that +chooses between the next two arguments. + +%\spoint More examples of expansion in conditionals +\subsection{More examples of expansion in conditionals} + +Above, the macro \cs{ifEqString} was given +\alt +that compares two strings: +\howto Compare two strings\par +\begin{verbatim} +\def\ifEqString#1#2% + {\def\csa{#1}\def\csb{#2}\ifx\csa\csb } +\end{verbatim} +However, this macro relies on \cs{def}, which is not an +expandable command. If we need a string tester that will +work, for instance, inside an \cs{edef}, we need some +more ingenuity (this solution was taken from~\cite{E2}). +The basic principle of this solution is to compare the strings +one character at a time. Macro delimiting by \cs{fi} is used; +this was explained above. + +First of all, the \cs{ifEqString} call is replaced by a +sequence \verb>\ifAllChars ...\Are ...\TheSame>, and both +strings are delimited by a dollar sign, which is not supposed +to appear in the strings themselves. +\begin{verbatim} +\def\ifEqString + #1#2{\ifAllChars#1$\Are#2$\TheSame} +\end{verbatim} +The test for equality of characters first determines +whether either string has ended. If both have ended, the original +strings were equal; if only one has ended, they were of unequal +length, hence unequal. If neither string has ended, we test +whether the first characters are equal, and if so, we make a recursive +call to test the remainder of the string. +\begin{verbatim} +\def\ifAllChars#1#2\Are#3#4\TheSame + {\if#1$\if#3$\say{true}% + \else \say{false}\fi + \else \if#1#3\ifRest#2\TheSame#4\else + \say{false}\fi\fi} +\def\ifRest#1\TheSame#2\else#3\fi\fi + {\fi\fi \ifAllChars#1\Are#2\TheSame} +\end{verbatim} +The \cs{say} macro is supposed to give \cs{iftrue} for +\verb>\say{true}> and \cs{iffalse} for \verb>\say{false}>. +Observing that all calls to this macro occur two conditionals deep, +we use the `hop' trick explained above as follows. +\begin{verbatim} +\def\say#1#2\fi\fi + {\fi\fi\csname if#1\endcsname} +\end{verbatim} + +Similar to the above example, let us write a macro +that will test lexicographic (`dictionary') precedence +of two strings: +\howto Compare two strings lexicographically\par +\begin{verbatim} +\let\ex=\expandafter +\def\ifbefore + #1#2{\ifallchars#1$\are#2$\before} +\def\ifallchars#1#2\are#3#4\before + {\if#1$\say{true\ex}\else + \if#3$\say{false\ex\ex\ex}\else + \ifnum`#1>`#3 \say{false% + \ex\ex\ex\ex\ex\ex\ex}\else + \ifnum`#1<`#3 \say{true% + \ex\ex\ex\ex\ex\ex\ex + \ex\ex\ex\ex\ex\ex\ex\ex}\else + \ifrest#2\before#4\fi\fi\fi\fi} +\def\ifrest#1\before#2\fi\fi\fi\fi + {\fi\fi\fi\fi + \ifallchars#1\are#2\before} +\def\say#1{\csname if#1\endcsname} +\end{verbatim} +In this macro a slightly +different implementation of \cs{say} is used. + +Simplified, a call to \cs{ifbefore} will eventually lead to a situation +that looks (in the `true' case) like +\begin{verbatim} +\ifbefore{...}{...} + \if... %% some comparison that turns out true + \csname iftrue\expandafter\endcsname + \else .... \fi + ... %% commands for the `before' case +\else + ... %% commands for the `not-before' case +\fi +\end{verbatim} +When the comparison has turned out true, \TeX\ will start processing +the \gr{true text}, and make a mental note to remove any +\verb>\else ... \fi> part once an \cs{else} token is seen. +Thus, the sequence +\begin{verbatim} +\csname iftrue\expandafter\endcsname \else ... \fi +\end{verbatim} +is replaced by \begin{verbatim} + \csname iftrue\endcsname +\end{verbatim} +as the \cs{else} is seen while \TeX\ is still processing +\verb>\csname...\endcsname>. + +Calls to \cs{say} occur inside nested conditionals, so +the number of \cs{expandafter} commands necessary may be +\alt +larger than~1: for level two it is~3, for level three +it is~7, and for level~4 it is 15. Slightly more compact +implementations of this macro do exist. + +%%%% end of input file [ifelsefi] + +%\InputFile:token +%%%% this is input file [token] +%\subject[token] Token Lists +\endofchapter +\chapter{Token Lists}\label{token} + +\TeX\ has only one type of data structure: the token list. +\term token! lists\par\term list !token\par +There are token list registers that are available to the user, +and \TeX\ has some special token lists: the \cs{every...} +variables, \cs{errhelp}, and \cs{output}. + + +\begin{inventory} +\item [\cs{toks}] + Prefix for a token list register. + +\item [\cs{toksdef}] + Define a control sequence to be a synonym for + a~\cs{toks} register. + +\item [\cs{newtoks}] + Macro that allocates a token list register. + +\end{inventory} + +%\point Token lists +\section{Token lists} + +Token lists are the only type of data structure that \TeX\ knows. +They can contain character tokens and control sequence tokens. +Spaces in a token list are significant. +The only operations on token lists are assignment and +unpacking. + +\TeX\ has 256 token list registers \verb|\toks|$nnn$ that can be +allocated using the macro \verb|\newtoks|, or explicitly +assigned by \cs{toksdef}; see below. + +%\point Use of token lists +\section{Use of token lists} + +Token lists are assigned by a \gr{variable assignment}, +which is in this case takes one of the forms +\begin{disp}\gr{token variable}\gr{equals}\gr{general text}\nl + \gr{token variable}\gr{equals}\gr{filler}\gr{token variable}\end{disp} +Here a \gr{token variable} is an explicit \cs{toks}$nnn$ +register, something that has been defined to such a register +by \cs{toksdef} (probably hidden in \cs{newtoks}), +or one of the special \gr{token parameter} +lists below. +A~\gr{general text} has an explicit closing brace, but the +open brace can be implicit. + +Examples of token lists are (the first two lines are equivalent): +\begin{verbatim} +\toks0=\bgroup \a \b cd} +\toks0={\a \b cd} +\toks1=\toks2 +\end{verbatim} + +Unpacking a token list is done by the command \cs{the}: +the expansion of \cs{the}\gr{token variable} is the +sequence of tokens that was in the token list. + +Token lists have a special behaviour in \cs{edef}: +when prefixed by \verb|\the| they are unpacked, +but the resulting tokens +are not evaluated further. Thus +\begin{verbatim} +\toks0={\a \b} \edef\SomeCs{\the\toks0} +\end{verbatim} +gives +\begin{verbatim} +\SomeCs: macro:-> \a \b +\end{verbatim} +This is in contrast to what happens ordinarily in an~\cs{edef}; +see page~\pageref{expand:edef}. + + +%\point \gr{token parameter} +\section{\gr{token parameter}} + +There are in \TeX\ a number of token lists that are automatically +inserted at certain points. These \gr{token parameter}s are +the following: +\begin{description} \item [\cs{output}] + this token list is inserted + whenever \TeX\ decides it has sufficient material for a page, + or when the user forces activation by a penalty~$\leq-10\,000$ + in vertical mode + (see Chapter~\ref{output}); +\item [\cs{everypar}] + is inserted when \TeX\ switches from external or internal + vertical mode to unrestricted horizontal mode + (see Chapter~\ref{par:start}); +\item [\cs{everymath}] + is inserted after a single math-shift character that starts + a formula; +\item [\cs{everydisplay}] + is inserted after a double math-shift character that starts + a display formula; +\item [\cs{everyhbox}] + is inserted when an \cs{hbox} begins (see Chapter~\ref{boxes}); +\item [\cs{everyvbox}] + is inserted when a vertical box begins (see Chapter~\ref{boxes}); +\item [\cs{everyjob}] + is inserted when a job begins (see Chapter~\ref{run}); +\item [\cs{everycr}] + is inserted in alignments after \cs{cr} or a non-redundant + \cs{crcr} (see Chapter~\ref{align}); +\item [\cs{errhelp}] + contains tokens to supplement an \cs{errmessage} + (see Chapter~\ref{error}). +\end{description} + +A \gr{token parameter} behaves the same as an explicit \cs{toks}$nnn$ +list, or a quantity defined by \cs{toksdef}. + +%\point Token list registers +\section{Token list registers} + +Token lists can be stored in \csidx{toks} registers: +\begin{Disp}\cs{toks}\gr{8-bit number}\end{Disp} +which is a \gr{token variable}. +Synonyms for token list registers can be made by the \gr{registerdef} +command \csidx{toksdef} in a \gr{shorthand definition}: +\begin{Disp}\cs{toksdef}\gr{control sequence}\gr{equals}\gr{8-bit number} +\end{Disp} A control sequence defined this way is called +a \gr{toksdef token}, and this is also a token variable +(the remaining third kind of token variable is +the \gr{token parameter}). + +The plain \TeX\ macro \csidx{newtoks} uses \cs{toksdef} to +allocate unused token list registers. This macro is \cs{outer}. + +%\point Examples +\section{Examples} + +Token lists are probably among the least obvious components +of \TeX: most \TeX\ users will never find occasion for their use, +but format designers and other macro writers +can find interesting applications. +Following are some examples of the sorts of things that can be +done with token lists. + +%\spoint Operations on token lists: stack macros +\subsection{Operations on token lists: stack macros} + +The number of primitive operations available for token lists is +\howto Stack macros\par +rather limited: assignment and unpacking. However, these are +sufficient to implement other operations such as appending. + +Let us say we have allocated a token register +\begin{verbatim} +\newtoks\list \list={\c} +\end{verbatim} +and we want to add tokens to it, +\alt +using the syntax +\begin{verbatim} +\Prepend \a \b (to:)\list +\end{verbatim} +such that \begin{verbatim} +\showthe\list +\end{verbatim} +gives \begin{verbatim} +> \a \b \c . +\end{verbatim} +For this the original list has to be unpacked, and +\alt +the new tokens followed by the old contents have to assigned +again to the register. Unpacking can be done with \cs{the} +inside an \cs{edef}, so we arrive at the following macro: +\begin{verbatim} +\def\Prepend#1(to:)#2{\toks0={#1}% + \edef\act{\noexpand#2={\the\toks0 \the#2}}% + \act} +\end{verbatim} +Note that the tokens that are to be added are first packed +\alt +into a temporary token list, which is then again unpacked +inside the \cs{edef}. Including them directly would have +led to their expansion. + +Next we want to use token lists as a sort of stack: +we want a `pop' operation that removes the first element +from the list. Specifically, +\begin{verbatim} +\Pop\list(into:)\first +\show\first \showthe\list +\end{verbatim} +should give +\begin{verbatim} +> \first=macro: +->\a . +\end{verbatim} +and for the remaining list +\begin{verbatim} + +> \b \c . +\end{verbatim} + +Here we make creative use of delimited and undelimited +parameters. With an \cs{edef} we unpack the list, +and the auxiliary macro \cs{SplitOff} scoops up the elements +as one undelimited argument, the first element, and one +delimited argument, the rest of the elements.\begin{verbatim} +\def\Pop#1(into:)#2{% + \edef\act{\noexpand\SplitOff\the#1% + (head:)\noexpand#2(tail:)\noexpand#1}% + \act} +\def\SplitOff#1#2(head:)#3(tail:)#4{\def#3{#1}#4={#2}} +\end{verbatim} + +%\spoint Executing token lists +\subsection{Executing token lists} + +The \cs{the} operation for unpacking token lists was used above +only inside an \cs{edef}. Used on its own it has the effect +of feeding the tokens of the list to \TeX's expansion mechanism. +If the tokens have been added to the list in a uniform syntax, +this gives rise to some interesting possibilities. + +Imagine that we are implementing the bookkeeping of external +files for a format. Such external files can be used for +table of contents, list of figures, et cetera. +If the presence +of such objects is under the control of the user, we need some +general routines for opening and closing files, and keeping +track of what files we have opened at the user's request. + +Here only some routines for bookkeeping will be described. +Let us say there is a list of auxiliary files, and an auxiliary +counter: \begin{verbatim} +\newtoks\auxlist \newcount\auxcount +\end{verbatim} +First of all there must be an operation to add auxiliary files: +\begin{verbatim} +\def\NewAuxFile#1{\AddToAuxList{#1}% + % plus other actions + } +\def\AddToAuxList#1{\let\\=\relax + \edef\act{\noexpand\auxlist={\the\auxlist \\{#1}}}% + \act} +\end{verbatim} +This adds the name to the list in a uniform format: +\begin{verbatim} +\NewAuxFile{toc} \NewAuxFile{lof} +\showthe\auxlist +> \\{toc}\\{lof}. +\end{verbatim} +using the control sequence \verb>\\> which is left undefined. + +Now this control sequence can be used for instance to +count the number of elements in the list:\begin{verbatim} +\def\ComputeLengthOfAuxList{\auxcount=0 + \def\\##1{\advance\auxcount1\relax}% + \the\auxlist} +\ComputeLengthOfAuxList \showthe\auxcount +> 2. +\end{verbatim} +Another use of this structure is the following: +at the end of the job we can now close all auxiliary +files at once, by\begin{verbatim} +\def\CloseAuxFiles{\def\\##1{\CloseAuxFile{##1}}% + \the\auxlist} +\def\CloseAuxFile#1{\message{closing file: #1. }% + % plus other actions + } +\CloseAuxFiles +\end{verbatim} +which gives the output +\begin{verbatim} +closing file: toc. closing file: lof. +\end{verbatim} + +% \begin{comment} + +% %\spoint Dynamic macro definition +% \subsection{Dynamic macro definition} + +% Unpacking token lists inside an \cs{edef} can be put to a +% rather ambitious use: dynamic definition of macros. +% Consider a simple example. +% \altt +% We set ourselves the goal of letting +% the user define macros, without ever having to use \cs{def}. +% The syntax for this could look like\begin{verbatim} +% \startdefinition +% \do:this +% \do:that +% \define:MyMacro +% \end{verbatim} +% such that \verb>\show\MyMacro> gives \begin{verbatim} +% > \MyMacro=macro: +% ->\this \that . +% \end{verbatim} +% An implementation of this uses a token list to collect +% the commands that the user specifies:\begin{verbatim} +% \newtoks\actionlist +% \end{verbatim} +% The first command is easy:\begin{verbatim} +% \def\startdefinition{\actionlist{}} +% \end{verbatim} +% Now the \cs{do} command has to hang control sequences +% in the \cs{actionlist}:\begin{verbatim} +% \def\do:#1 {% +% \edef\act{\noexpand\appendaction +% \expandafter\noexpand\csname#1\endcsname}% +% \act} +% \end{verbatim} +% The \cs{edef} is used solely to form the actual control sequence. +% The next macro uses \cs{edef} to unpack the \cs{actionlist} so far: +% \begin{verbatim} +% \def\appendaction#1{% +% \edef\act{\noexpand\actionlist= +% {\the\actionlist \noexpand#1}}% +% \act} +% \end{verbatim} +% Finally, definition of the user macro also needs an \cs{edef}. +% Some \cs{expandafter} trickery is necessary here to form +% the control sequence of the user macro:\begin{verbatim} +% \def\define:#1 {% +% \expandafter\edef\csname#1\endcsname{\the\actionlist}} +% \end{verbatim} + +% Of course, this is a very simple, rather pointless, example. +% However, it illustrates an important principle of how +% token lists can be used to implement another syntax level +% in \TeX\ (see~\cite{EL}). This principle underlies the +% \term Lollipop\par +% `Lollipop' format that was used to typeset this book. + +% \end{comment} +%%%% end of input file [token] + +%\InputFile:baseline +%%%% this is input file [baseline] +%\subject[baseline] Baseline Distances +\endofchapter +\chapter{Baseline Distances}\label{baseline} + +\hbox{}\vfil\vfil\hbox{} +Lines of text are in most cases not of equal height or depth. +Therefore \TeX\ adds interline glue to keep baselines at a uniform +distance from one another. +This chapter treats the computation of such +interline glue. + +\begin{inventory} + +\item [\cs{baselineskip}] + The `ideal' baseline distance between neighbouring + boxes on a vertical list. Plain \TeX\ default:~\n{12pt}. + +\item [\cs{lineskiplimit}] + Distance to be maintained between the bottom and top of + neighbouring boxes on a vertical list. + Plain \TeX\ default:~\n{0pt}. + +\item [\cs{lineskip}] + Glue added if the distance between bottom + and top of neighbouring boxes + is less than \cs{lineskiplimit}. + Plain \TeX\ default:~\n{1pt}. + +\item [\cs{prevdepth}] + Depth of the last box added to a vertical list as it is + perceived by \TeX. + +\item [\cs{nointerlineskip}] + Macro to prevent interline glue insertion once. + +\item [\cs{offinterlineskip}] + Macro to prevent interline glue globally + henceforth. + +\item [\cs{openup}] + Increase \cs{baselineskip}, \cs{lineskip}, + and \cs{lineskiplimit} by specified amount. + +\end{inventory} + + +\hbox{}\vfil\hbox{} + +%\point Interline glue +\section{Interline glue} + +%\input figs17 +\message{fig17 missing} + +\TeX\ tries to keep a certain distance between the reference +\term glue !interline\par\term baseline! distance\par +points of boxes that are added to a vertical list; +in particular it tries to keep the baselines of ordinary text +at a constant distance, the \csidx{baselineskip}. Actually, +the \cs{baselineskip} is a \gr{glue}, so line distances can +stretch or shrink. However, the natural sizes, +as well as the stretch and the shrink, are the same +between all lines. + +When boxes, whether they are lines of a paragraph or explicit boxes, +are appended to a vertical list, glue +is added usually so that the depth of the preceding box +and the height of the current one add up to the \cs{baselineskip}. +This has the effect of keeping the reference points +of subsequent lines at regular intervals. + +\eject + +\message{fig one missing} +%\begin{disp}\leavevmode\hbox{}\nl\figone\end{disp} + +However, this process can bring the bottom and top of two +subsequent boxes to be less than \cs{lineskiplimit} apart: +\message{fig two missing} +%\begin{disp}\leavevmode\figtwo\end{disp} + +In that case, \cs{lineskip} glue is added: +\message{fig three missing} +%\begin{disp}\leavevmode\figthree\end{disp} +Note that this will usually increase the distance +between the baselines of the boxes to more than the +\cs{baselineskip}. + +The exact process is this: +\begin{itemize} +\item if \cs{prevdepth} is \n{-1000pt} or less, +no glue is added, otherwise +\item \TeX\ calculates the distance between the bottom of the previous box +and the top of the current one as the natural width of the +\cs{baselineskip} minus \cs{prev\-depth} (the +depth of the last box) and minus the height of the current box; +\item if this distance is at least \csidx{lineskiplimit}, +glue is added with the calculated distance as natural size, +and with the stretch and shrink of the \cs{baselineskip}, +\item otherwise \csidx{lineskip} glue is added. +\item \csidx{prevdepth} is set to the depth of the +current item. +\end{itemize} + +There are two exceptional situations: +no interline glue is added before and after a rule, +and the \cs{prevdepth} is not updated by an \cs{unvbox} +or \cs{unvcopy} command. After a rule interline glue +is prevented by a value of \n{-1000pt} of the \cs{prevdepth}. + +The above process is carried out, irrespective of what extra +glue may have been inserted in between the boxes. +Thus a skip in between boxes in vertical mode will not +affect the distance calculated from the baseline distances, +and therefore also not the amount of baselineskip glue. +The same holds for glue added with \cs{vadjust} inside +a paragraph. + +\begin{example}\begin{verbatim} +\baselineskip=10pt \lineskiplimit=2pt \lineskip=2pt +\setbox0=\vbox{\hbox{\vrule depth4pt} + \hbox{\vrule height 3pt}} +\showbox0 +\end{verbatim} +gives\begin{verbatim} +\box0= +\vbox(10.0+0.0)x0.4 +.\hbox(0.0+4.0)x0.4 +..\rule(*+4.0)x0.4 +.\glue(\baselineskip) 3.0 +.\hbox(3.0+0.0)x0.4 +..\rule(3.0+*)x0 +\end{verbatim} +Bringing the boxes to within \cs{lineskiplimit} +of each other, that is\begin{verbatim} +\setbox0\vbox{\hbox{\vrule depth4pt} + \hbox{\vrule height 5pt}} +\showbox0 +\end{verbatim} +gives\begin{verbatim} +\box0= +\vbox(11.0+0.0)x0.4 +.\hbox(0.0+4.0)x0.4 +..\rule(*+4.0)x0.4 +.\glue(\lineskip) 2.0 +.\hbox(5.0+0.0)x0.4 +..\rule(5.0+*)x0.4 +\end{verbatim} +where \cs{lineskip} glue has been inserted +instead of the usual \cs{baselineskip} glue. +\end{example} + +The plain \TeX\ default values are +\begin{verbatim} +\lineskiplimit=0pt lineskip=1pt +\end{verbatim} +so, when boxes start to touch each other, they are +moved one point apart. + +%\point The perceived depth of boxes +\section{The perceived depth of boxes} + +The decision process for interline glue uses \csidx{prevdepth} +as the perceived depth of the preceding box on the vertical +list. The \cs{prevdepth} parameter can be used only in +vertical mode. + +The \cs{prevdepth} is set to the depth of boxes added to the +vertical list, but it is not affected by \cs{unvbox} +or \cs{unvcopy}. After an \cs{hrule} it is set to +\n{-1000pt} to prevent interline glue before the next box. + +At the beginning of a vertical list \cs{prevdepth} +is set to \n{-1000pt}, except in an \cs{halign} +and \cs{noalign} code contained therein, where it +is carried over from the surrounding list. +At the end of the alignment the value of \cs{prevdepth} +set by the last alignment row is carried to the outer list. + +In order to prevent interline glue just once, all that +is needed is to alter the \cs{prevdepth}. +\cstoidx nointerlineskip\par +\begin{verbatim} +\def\nointerlineskip{\prevdepth=-1000pt} +\end{verbatim} + +The \csidx{offinterlineskip} macro is much more drastic: +it prevents {\sl all\/} interline glue from the moment +of its call onwards, or, if it is used inside a paragraph, +from the start of that paragraph. +Its definition is +\begin{verbatim} +\baselineskip=-1000pt \lineskip=0pt +\lineskiplimit\maxdimen +\end{verbatim} +where the second line is the essential one: it +causes \TeX\ to add \cs{lineskip} glue (which is zero) +always. +Settings for \cs{baselineskip} do not matter any more then. + +The \cs{offinterlineskip} macro has an important application +in alignments (see Chapter~\ref{align}). + +By setting \begin{verbatim} +\lineskiplimit=-\maxdimen +\end{verbatim} +you can force \TeX\ to apply the \cs{baselineskip} +always, regardless of whether this would bring boxes too close +together or, indeed, if this would make them overlap. + +%\point Terminology +\section{Terminology} + +In hot metal typesetting, all letters of a particular font +were on a `body' of the same +size. Thus every line of type had the same height and depth, and +the resulting distance between the baselines would be some suitable +value for that type. If for some reason this distance should +be larger (see~\cite{White:line} for a discussion of this), +strips of lead would be inserted. The extra distance was +called the `leading' (pronounced `ledding'). + +With phototypesetting, when the baseline distance was sometimes +called the `film transport', this terminology blurred, and the +term `leading' was also used for the baseline distance. Some of this +confusion is also present in \TeX: the parameter \cs{baselineskip} +specifies the baseline distance, but in the trace output +(see the examples above) the glue inserted to make the +baseline distance equal to \cs{baselineskip} is called +\cs{baselineskip}. + +%\point Additional remarks +\section{Additional remarks} + +In general, for documents longer than one page it is desirable +to have the same baseline distance throughout. However, +for one-page documents you may add stretchability to the +baselineskip, for instance if the text has to be flush bottom. + +Increasing the distance between just one pair of lines +can be done with \cs{vadjust}. The argument of this +command is vertical material that\vadjust{\kern2pt} +will be inserted in the +vertical list right after the line where this command was given. +The second line of this paragraph, for instance, +contains the command \verb-\vadjust{\kern2pt}-. + +The amount of leading cannot be changed in the middle of +a paragraph, because the value for \cs{baselineskip} +that is used is the one that +is current when the paragraph is finally broken and +added to the main vertical list. The same holds +for the \cs{lineskip} and \cs{lineskiplimit}. + +The plain \TeX\ macro \csidx{openup} +increases the \cs{baselineskip}, \cs{lineskip}, and +\cs{lineskiplimit} by the amount of the argument +to the macro. In effect, this increases line distances +by this amount regardless of whether they are governed +by \cs{baselineskip} or \cs{lineskip}. + + +%%%% end of input file [baseline] + +%\InputFile:par +%%%% this is input file [par] +%\subject[par:start] Paragraph Start +\endofchapter +\chapter{Paragraph Start}\label{par:start} + +At the start of a paragraph \TeX\ inserts a vertical skip +as a separation from the preceding paragraph, and a horizontal +skip as an indentation for the current paragraph. +This chapter explains the exact sequence +of actions, +and it discusses how \TeX's decisions can be altered. + +\begin{inventory} +\item [\cs{indent}] + Switch to horizontal mode and insert a box of width \cs{parindent}. + +\item [\cs{noindent}] + Switch to horizontal mode with an empty horizontal list. + +\item [\cs{parskip}] + Amount of glue added to + the surrounding vertical list when a paragraph starts. + Plain \TeX\ default:~\n{0pt plus 1pt}. + +\item [\cs{parindent}] + Size of the indentation box added in front of a paragraph. + Plain \TeX\ default:~\n{20pt}. + +\item [\cs{everypar}] + Token list inserted in front of paragraph text; + +\item [\cs{leavevmode}] + Macro to switch to horizontal mode if necessary. + +\end{inventory} + + +%\point When does a paragraph start +\section{When does a paragraph start} + +\TeX\ starts a paragraph whenever it switches from +vertical mode to (unrestricted) horizontal mode. This switch can +be effected by one of the commands +\cs{indent} and +\cs{noindent}, for example\begin{verbatim} +{\bf And now~\dots} +\vskip3pt +\noindent It's~\dots +\end{verbatim} +or by any \gram{horizontal command}. +Horizontal commands include characters, in-line formulas, +and horizontal skips, but not boxes. +Consider the following examples. +\alt +The character `I' is a horizontal command: +\begin{verbatim} +\vskip3pt +It's~\dots +\end{verbatim} +A single \n\$ is a horizontal command: +\begin{verbatim} +$x$ is supposed~\dots +\end{verbatim} +The control sequence \cs{hskip} is a horizontal command: +\begin{verbatim} +\hskip .5\hsize Long indentation~\dots +\end{verbatim} +The full list of horizontal commands is given on +page~\pageref{h:com:list}. + +Upon recognizing a horizontal command in vertical mode, +\TeX\ will perform an \cs{indent} command (and all the actions +associated with it; see below), +and after that it will reexamine the horizontal command, +this time executing it. + + + +%\point What happens when a paragraph starts +\section{What happens when a paragraph starts} + +The \csidx{indent} and \csidx{noindent} commands +\term paragraph! start\par +cause a paragraph to be started. +An~\cs{indent} command can either be placed explicitly by +the user or a macro, or it can be inserted by \TeX\ when +a \gr{horizontal command} occurs in vertical mode; +a~\cs{noindent} command can only be placed explicitly. + +After either command is encountered, +\csidx{parskip} glue is appended to the surrounding vertical +list +unless \TeX\ is in internal vertical mode +and that list is empty +(for example, at the start of a \cs{vbox} or \cs{vtop}). +\TeX\ then switches to unrestricted horizontal mode +with an empty horizontal list. +In the case of \cs{indent} (which may be inserted +implicitly) an empty \cs{hbox} of width +\cstoidx parindent\par +\cs{parindent} is placed at the start of the horizontal list; +after \cs{noindent} no indentation +box is inserted. + +The contents of the \csidx{everypar} \gr{token parameter} +are then inserted into the input (see some applications below). +After that, +the page builder is exercised (see Chapter~\ref{page:break}). +Note that this happens in horizontal mode: this is to +move the \cs{parskip} glue to the current page. + +If an \cs{indent} command is given while \TeX\ is already in +horizontal mode, the indentation box is inserted just the same. +This is not very useful. + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Starting a paragraph with a box +\subsection{Starting a paragraph with a box} + +An \cs{hbox} does not imply horizontal mode, so +an attempt to start a paragraph with a box, for instance +\begin{verbatim} +\hbox to 0cm{\hss$\bullet$\hskip1em}Text .... +\end{verbatim} +will make the text following the box +wind up one line below the box. +It is necessary to switch to horizontal mode +explicitly, using for instance \cs{noindent} or +\cs{leavevmode}. +The latter is defined using \cs{unhbox}, +which is a horizontal command. + +%\spoint Starting a paragraph with a group +\subsection{Starting a paragraph with a group} + +If the first \gram{horizontal command} of a paragraph +is enclosed in braces, the \cs{everypar} is evaluated +inside the group. This may give unexpected results. +Consider this example: +\begin{verbatim} +\everypar={\setbox0=\vbox\bgroup\def\par{\egroup}} +{\bf Start} a paragraph ... \par +\end{verbatim} +The \gr{horizontal command} starting the paragraph is the +character~`S', so when \cs{everypar} has been inserted +the input is essentially +\begin{verbatim} +{\bf \indent\setbox0=\vbox\bgroup + \def\par{\egroup}Start} a paragraph ... \par +\end{verbatim} +which is equivalent to +\begin{verbatim} +{\bf \setbox0=\vbox{Start} a paragraph ... \par +\end{verbatim} +The effect of this is rather different from what was intended. +\alt +Also, \TeX\ will probably end the job inside a group. + +%\point Examples +\section{Examples} + +%\spoint Stretchable indentation +\subsection{Stretchable indentation } + +Considering that \cs{parindent} is a \gram{dimen}, not a \gram{glue}, +it is not possible to declare +\begin{verbatim} +\parindent=1cm plus 1fil +\end{verbatim} +in order to get +a variable indentation at the start of a paragraph. +This problem may be solved by putting +\begin{verbatim} +\everypar={\nobreak\hskip 1cm plus 1fil\relax} +\end{verbatim} +The \cs{nobreak} serves to prevent (in rare cases) a line break +at the stretchable glue. + +%\spoint Suppressing indentation +\subsection{Suppressing indentation} + +Inserting +\verb.{\setbox0=\lastbox}. in the horizontal list +at the beginning of the paragraph +removes the indentation: +indentation consists of a box, which is available through +\cs{lastbox}. Assigning it effectively removes it from the list. + +However, this command sequence +has to be inserted at a moment when \TeX\ has +already switched to horizontal mode, so explicit insertion +of these commands in front of the first \gram{horizontal +command} of the paragraph does not work. +The moment of insertion of the \cs{everypar} tokens +is a better candidate: specifying +\begin{verbatim} +\everypar={{\setbox0=\lastbox}} +\end{verbatim} +leads to unindented paragraphs, even if \cs{parindent} is +not zero. + + +%\spoint[indent:scheme] An indentation scheme +\subsection{An indentation scheme} +\label{indent:scheme} + +The above idea of letting the indentation box be removed +\howto Control indentation systematically\par +by \cs{everypar} can be put to use in a systematic approach +to indentation, where two conditionals +\begin{verbatim} +\newif\ifNeedIndent %as a rule +\newif\ifneedindent %special cases +\end{verbatim} +control whether paragraphs should indent as a rule, and +whether in special cases indentation is needed. +This section is taken from~\cite{E3}. + +We take a fixed \cs{everypar}: +\begin{verbatim} +\everypar={\ControlledIndentation} +\end{verbatim} +which executes in some cases the macro \cs{RemoveIndentation} +\begin{verbatim} +\def\RemoveIndentation{{\setbox0=\lastbox}} +\end{verbatim} +The implementation of \cs{ControlledIndentation} is:\begin{verbatim} +\def\ControlledIndentation + {\ifNeedIndent \ifneedindent + \else \RemoveIndentation\needindenttrue \fi + \else \ifneedindent \needindentfalse + \else \RemoveIndentation + \fi \fi} +\end{verbatim} +In order to regulate indentation for a whole document, +the user now once specifies, for instance, +\begin{verbatim} +\NeedIndenttrue +\end{verbatim} +to indicate that, in principle, +all paragraphs should indent. +Macros such as \cs{section} can then prevent +indentation in individual cases: +\begin{verbatim} +\def\section#1{ ... \needindentfalse} +\end{verbatim} + + +%\spoint[skip:scheme] A paragraph skip scheme +\subsection{A paragraph skip scheme} +\label{skip:scheme} + +The use of \cs{everypar} to control indentation, +\howto Control vertical white space systematically\par +as was sketched above, can be extended to the +paragraph skip. + +A visible white space between paragraphs can be +created by the \cs{parskip} parameter, but, once this +parameter has been set to some value, it is difficult +to prevent paragraph skip in certain places elegantly. +Usually, white space above and below environments +and section headings should be specifiable independently +of the paragraph skip. This section sketches an +approach where \cs{parskip} is set to zero directly +above and below certain constructs, while the \cs{everypar} +is used to restore former values. This section is +taken from~\cite{E4}. + +First of all, here are two tools. The control sequence +\cs{csarg} will be used only inside other macros; +a typical call will look like +\begin{verbatim} +\csarg\vskip{#1Parskip} +\end{verbatim} +Here is the definition:\begin{verbatim} +\def\csarg#1#2{\expandafter#1\csname#2\endcsname} +\end{verbatim} +Next follows a generalization of \cs{vskip}: the macro +\cs{vspace} will not place its argument if the previous glue item +is larger; otherwise it will eliminate the preceding +glue, and place its argument.\begin{verbatim} +\newskip\tempskipa +\def\vspace#1{\tempskipa=#1\relax + \ifvmode \ifdim\tempskipa<\lastskip + \else \vskip-\lastskip \vskip\tempskipa \fi + \else \vskip\tempskipa \fi} +\end{verbatim} + +Now assume that any construct \n{foo} +with surrounding white space +starts and ends with macro calls \verb>\StartEnvironment{foo}> and +\verb>\EndEnvironment{foo}> respectively. +Furthermore, assume that to this environment there correspond +three glue registers: +the \cs{fooStartskip} (glue +above the environment), \cs{fooParskip} (the paragraph skip +inside the environment), and the \cs{fooEndskip} (glue below +the environment). + +For restoring the value of the paragraph skip +a conditional and a glue register are needed:\begin{verbatim} +\newskip\TempParskip \newif\ifParskipNeedsRestoring +\end{verbatim} +The basic sequence for the +starting and ending macros for the environments is then +\begin{verbatim} +\TempParskip=\parskip\parskip=0cm\relax +\ParskipNeedsRestoringtrue +\end{verbatim} + +The implementations can now be given as:\begin{verbatim} +\def\StartEnvironment#1{\csarg\vspace{#1Startskip} + \begingroup % make changes local + \csarg\TempParskip{#1Parskip} \parskip=0cm\relax + \ParskipNeedsRestoringtrue} +\def\EndEnvironment#1{\csarg\vspace{#1Endskip} + \endgroup % restore global values + \ifParskipNeedsRestoring + \else \TempParskip=\parskip \parskip=0cm\relax + \ParskipNeedsRestoringtrue + \fi} +\end{verbatim} +The \cs{EndEnvironment} macro needs a little comment: +if an environment is used inside another one, and +it occurs before the first paragraph in that environment, +the value of the paragraph skip for the outer environment +has already been saved. Therefore no further actions are +required in that case. + +Note that both macros start with a vertical skip. This prevents +the \cs{begingroup} and \cs{endgroup} statements from +occurring in a paragraph. + +We now come to the main point: if necessary, the +\cs{everypar} will restore the value of the paragraph skip. +\begin{verbatim} +\everypar={\ControlledIndentation\ControlledParskip} +\def\ControlledParskip + {\ifParskipNeedsRestoring + \parskip=\TempParskip \ParskipNeedsRestoringfalse + \fi} +\end{verbatim} + +%\subject[par:end] Paragraph End +\endofchapter +\chapter{Paragraph End}\label{par:end} + +\TeX's mechanism for ending a paragraph is ingenious and effective. +This chapter explains the mechanism, the role of \cs{par} in it, +and it gives a number of practical remarks. + +\begin{inventory} +\item [\cs{par}] + Finish off a paragraph and go into vertical mode. + +\item [\cs{endgraf}] + Synonym for \cs{par}: \verb>\let\endgraf=\par> + +\item [\cs{parfillskip}] + Glue that is placed between the last + element of the paragraph and the line end. + Plain \TeX\ default:~\n{0pt plus 1fil}. +\end{inventory} + +%\point The way paragraphs end +\section{The way paragraphs end} + +A paragraph is terminated by the primitive \cs{par} command, +\term paragraph! end\par +which can +be explicitly typed by the user (or inserted by +a macro expansion):\begin{verbatim} +... last words.\par +A new paragraph ... +\end{verbatim} +It can be implicitly generated in the input processor of \TeX\ +by an empty line (see Chapter~\ref{mouth}):\begin{verbatim} +... last words. + +A new paragraph ... +\end{verbatim} +The \cs{par} can be inserted because a \gr{vertical command} +occurred in unrestricted horizontal mode:\begin{verbatim} +... last words.\vskip6pt +A new paragraph ... +\end{verbatim} +Also, a paragraph ends if a closing brace is found +in horizontal mode inside \cs{vbox}, \cs{insert}, or \cs{output}. + +After the \cs{par} command \TeX\ goes into vertical mode +and exercises the page builder (see page~\pageref{par:page:build}). +If the \cs{par} was inserted because a vertical command occurred in +horizontal mode, the vertical command is then examined anew. +The \cs{par} does not insert any vertical +glue or penalties itself. A~\cs{par} command also clears +the paragraph shape parameters (see Chapter~\ref{par:shape}). + +%\spoint The \cs{par} command and the \cs{par} token +\subsection{The \cs{par} command and the \cs{par} token} + +It is important to distinguish between the \cs{par} token +and the primitive \cs{par} command that is the initial meaning of +that token. The \cs{par} token is inserted when the input +processor sees an empty +line, or when the execution processor finds a \gram{vertical command} +in horizontal mode; +the \cs{par} command is what actually closes off a paragraph. +Decoupling the token and the command is an important tool +for special effects in paragraphs (see some examples in +Chapters \ref{boxes} and~\ref{rules}). + + +%\spoint Paragraph filling: \cs{parfillskip} +\subsection{Paragraph filling: \cs{parfillskip}} + +After the last element of the paragraph \TeX\ implicitly inserts +the equivalent of +\cstoidx parfillskip\par +\begin{verbatim} +\unskip \penalty10000 \hskip\parfillskip +\end{verbatim} +The \cs{unskip} serves to remove any spurious glue at the +paragraph end, such as the space generated by the +line end if the \cs{par} was inserted by the input processor. +For example:\message{check unsplit paragraph example} +\begin{verbatim} +end. + +\noindent Begin +\end{verbatim} +results in the tokens +\begin{disp}\n{end.\char32}\cs{par} \n{Begin}\end{disp} +With the sequence inserted by the \cs{par} this becomes +\begin{disp}\n{end.\char32}\verb>\unskip\penalty10000\hskip ...>\end{disp} +which in turn gives +\begin{disp}\verb>end.\penalty ...>\end{disp} + +The \cs{parfillskip} is in plain \TeX\ first-order infinite +(\n{0pt plus 1fil}), +so ending a paragraph with \verb.\hfil$\bullet$\par. +will give a bullet halfway between the last word and the +line end; with \verb.\hfill$\bullet$\par. it will be +flush right. + + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Ending a paragraph and a group at the same time +\subsection{Ending a paragraph and a group at the same time} + +If a paragraph is set in a group, +it may be necessary to ensure that the \cs{par} ending +the paragraph occurs inside the group. +The parameters influencing the typesetting of the paragraph, +such as the \cs{leftskip} and the \cs{baselineskip}, +are only looked at when the paragraph is finished. +Thus finishing off a paragraph with +\begin{verbatim} +... last words.}\par +\end{verbatim} +causes the values to be used +that prevail outside the group, instead of those inside. + +Better ways to end the paragraph are +\begin{verbatim} +... last words.\par} +\end{verbatim} +or +\begin{verbatim} +... last words.\medskip} +\end{verbatim} +In the second example the vertical command \cs{medskip} +causes the \cs{par} token to be inserted. + +%\spoint Ending a paragraph with \cs{hfill}\cs{break} +\subsection{Ending a paragraph with \cs{hfill}\cs{break}} + +The sequence \verb.\hfill\break. is a way to force +a `newline' inside a paragraph. If you end a paragraph +with this, however, you will probably +get an \verb-Underfull \hbox- error. +Surprisingly, the underfull box is not the broken line +\ldash after all, that one was filled \rdash +but a completely empty box following it (actually, it +does contain the \cs{leftskip} and \cs{rightskip}). + +What happens? +The paragraph ends with \begin{verbatim} +\hfill\break\par +\end{verbatim} +which turns into +\begin{verbatim} +\hfill\break\unskip\nobreak\hskip\parfillskip +\end{verbatim} +The \cs{unskip} finds no preceding glue, so the \cs{break} +is followed by a penalty item and a glue item, both of +which disappear after the line break has been chosen at the +\cs{break}. +However, \TeX\ has already decided that there should be an extra +line, that is, an \verb.\hbox to \hsize.. And there is nothing +\alt +to fill it with, so an underfull box results. + +%\spoint Ending a paragraph with a rule +\subsection{Ending a paragraph with a rule} + +See page~\pageref{par:leaders:end} for paragraphs ending with +rule leaders instead of the default \cs{parfillskip} +white space. + +%\spoint No page breaks in between paragraphs +\subsection{No page breaks in between paragraphs} + +The \cs{par} command does not insert any glue in the +\howto Prevent page breaks in between paragraphs\par +vertical list, so +in the sequence +\begin{verbatim} + ... last words.\par \nobreak \medskip +\noindent First words ... +\end{verbatim} +no page breaks will occur between the paragraphs. +The vertical list generated is +\begin{verbatim} +\hbox(6.94444+0.0)x ... % last line of paragraph +\penalty 10000 % \nobreak +\glue 6.0 plus 2.0 minus 2.0 % \medskip +\glue(\parskip) 0.0 plus 1.0 % \parskip +\glue(\baselineskip) 5.05556 % interline glue +\hbox(6.94444+0.0)x ... % first line of paragraph +\end{verbatim} +\TeX\ will not break this vertical list above the \cs{medskip}, +because the penalty value prohibits it; it will not break +at any other place, because it can only break at glue if +that glue is preceded by a non-discardable item. + +%\spoint Finite \cs{parfillskip} +\subsection{Finite \cs{parfillskip}} + +In plain \TeX, \cs{parfillskip} has a (first-order) infinite +stretch component. All other glue in the last line of a +paragraph will then be set at natural width. +If the \cs{parfillskip} has only finite (or possibly zero) +stretch, other glue will be stretched or shrunk. +A display formula in a paragraph with such a last line +will be surrounded by \cs{abovedisplayskip} and \cs{belowdisplayskip}, +even if \cs{abovedisplayshortskip} glue would be in order. + +The reason for this is that glue setting is slightly +machine-dependent, and any such processes should be kept +out of \TeX's global decisions. + +%\spoint A precaution for paragraphs that do not indent +\subsection{A precaution for paragraphs that do not indent} + +If you are setting a text with both the paragraph indentation +and the white space between paragraphs zero, you run the risk +that the start of a new paragraph may be indiscernible when +the last line of the previous paragraph ends almost +or completely flush right. +A~sensible precaution for this is to set the \cs{parfillskip} +to, for instance \begin{verbatim} + \parfillskip=1cm plus 1fil +\end{verbatim} +instead of the usual \n{0cm~plus~1fil}. + +On the other hand, you may let yourself be convinced by +\cite{Tsch} that paragraphs should always indent. + +%\subject[par:shape] Paragraph Shape +\endofchapter +\chapter{Paragraph Shape}\label{par:shape} + +This chapter treats the parameters and commands that influence the +\term paragraph! shape\par +shape of a paragraph. + +\begin{inventory} +\item [\cs{parindent}] + Width of the indentation box added in front of a paragraph. + Plain \TeX\ default:~\n{20pt}. + +\item [\cs{hsize}] + Line width used for typesetting a paragraph. + Plain \TeX\ default:~\n{6.5in}. + +\item [\cs{leftskip}] + Glue that is placed to the left of all lines of a paragraph. + + +\item [\cs{rightskip}] + Glue that is placed to the right of all lines of a paragraph. + + +\item [\cs{hangindent}] + If positive, this indicates indentation from the left margin; + if negative, this is the negative of the indentation + from the right margin. + +\item [\cs{hangafter}] + If positive, this denotes the number of lines + before indenting starts; + if negative, the absolute value of this is the number + of indented lines starting with the first line of the paragraph. + Default:~\n1. + +\item [\cs{parshape}] + Command for general paragraph shapes. + +\end{inventory} + + +%\point The width of text lines +\section{The width of text lines} + +When \TeX\ has finished absorbing a paragraph, +\term line! width\par +it has formed a horizontal list, starting with an indentation +box, and ending with \cs{parfillskip} glue. +This list is then broken into lines of length \cs{hsize}. +\cstoidx hsize\par\cstoidx leftskip\par\cstoidx rightskip\par +Each line of a paragraph is padded left and right with +certain amounts of glue, the \cs{leftskip} and \cs{rightskip}, +which are taken into account in reaching \cs{hsize}. + +The values of \cs{leftskip} and \cs{rightskip} are taken +into account in the line-breaking algorithm. +Thus the main point about the \csidx{raggedright} +macro in plain \TeX\ and the \LaTeX\ `flushleft' +environment is that they +set the \cs{rightskip} to zero plus some stretch. + +The commands \cs{parshape} and \cs{hangindent} +also affect line width. They work by altering the +\cs{hsize} and afterwards shifting the boxes +containing the lines. + +%\point Shape parameters +\section{Shape parameters} + +%\spoint Hanging indentation +\subsection{Hanging indentation} + +\message{twolines?} +A simple, and frequently occurring, paragraph shape is that +\term hanging! indentation\par +\cstoidx hangafter\par\cstoidx hangindent\par +with a number of starting or trailing lines indented. +\TeX\ can realize such shapes using two parameters: +\cs{hangafter} and \cs{hangindent}. +Both can assume positive and negative values. + +The \cs{hangindent} controls the amount of indentation: +\begin{itemize}\item \cs{hangindent}${}>0$: the paragraph +is indented at the left margin by this amount. +\item\cs{hangindent}${}<0$: the paragraph is indented +at the right margin by the absolute value of this amount. +\end{itemize} +\def\exnul{\leftskip=0pt \rightskip=0pt \relax} +For example (assume \cs{parindent=0pt}), +\begin{disp}\leavevmode\message{Check parshape example!}% +\hbox{%\Distance:verbatimwhiteleft=0pt +$\vcenter{\snugbox{\begin{verbatim} + a a a a a a a a a a a a ... + + \hangindent=10pt + a a a a a a a a a a a a ... + + \hangindent=-10pt + a a a a a a a a a a a a ... +\end{verbatim} +}}$\quad gives\quad %\Spaces:2 gives \Spaces:2 +$\vcenter{\parindent0pt \setbox0\hbox{a a a a a}\hsize\wd0 + \leftskip=0pt %\parskip6pt + a a a a a a a a a a a a \dots\par%\vskip\baselineskip + \hangindent=10pt + a a a a a a a a a a a a \dots\par%\vskip\baselineskip + \hangindent=-10pt + a a a a a a a a a a a a \dots\par}$ +}\end{disp} +The default value of \cs{hangindent} is~\n{0pt}. + +The \cs{hangafter} parameter determines the number of +lines that is indented: +\begin{itemize}\item \cs{hangafter}${}\geq0$: +after this number of lines the rest of the lines will be +indented; in other words, this many lines from the +start of the paragraph will not be indented. +\item \cs{hangafter}${}<0$: the absolute value of this +is the number of lines that will be indented starting +at the beginning of the paragraph.\end{itemize} +For example, +\message{check left align} +\begin{disp}\leavevmode\hbox{%\Distance:verbatimwhiteleft=0pt +$\vcenter{\snugbox{\begin{verbatim} + a a a a a a a a a a a a ... + + \hangindent=10pt \hangafter=2 + a a a a a a a a a a a a ... + + \hangindent=10pt \hangafter=-2 + a a a a a a a a a a a a ... +\end{verbatim} +}}$%\quad looks like\quad% \Spaces:2 looks like \Spaces:2 +$\vcenter{\parindent0pt \setbox0\hbox{a a a a a}\hsize\wd0 + \leftskip=0pt %\parskip6pt + a a a a a a a a a a a a \dots\par%\vskip\baselineskip + \hangindent=10pt \hangafter=2 + a a a a a a a a a a a a \dots\par%\vskip\baselineskip + \hangindent=10pt \hangafter=-2 + a a a a a a a a a a a a \dots\par}$ +}\end{disp} +The default value for \cs{hangafter} is~\n1. + +With both parameters having the possibility to +be positive and negative, +four ways of hanging indentation result. See below +for hanging indentation into the margin (`outdent'). + +Hanging indentation is implemented as follows. +The amount of hanging indentation is subtracted +from the \cs{hsize} for the lines that indent; +after the paragraph has been broken into horizontal +boxes, the lines that should indent on the left are +shifted right. + +Regular indentation of size \cs{parindent} is not +influenced by hanging indentation. Thus you should +start a paragraph with hanging indentation +explicitly by~\cs{noindent} if the extra +indentation is unwanted. + +The default values of \cs{hangindent} and \cs{hangafter} are +restored after every \cs{par} command. + +%\spoint General paragraph shapes: \cs{parshape} +\subsection{General paragraph shapes: \cs{parshape}} + +Quite general paragraph shapes can be implemented +using \csidx{parshape}. With this command line lengths and indentation +for the first $n$ lines +of a paragraph can be specified. Thus this command +takes $2n+1$ parameters: the number of lines $n$, followed +by $n$ pairs of an indentation and a line length. +\begin{disp} \cs{parshape}\gr{equals} + $n$ $i_1$ $\ell_1$ $\ldots$ $i_n$ $\ell_n$\end{disp} +The specification for the last line is repeated if the +paragraph following has more than $n$ lines. If there are fewer +than $n$ lines the remaining specifications are ignored. +The default value is (naturally) \cs{parshape${}={}$0}. + +A \cs{parshape} command takes precedence over a \cs{hangindent} +if both have been specified. +%Regular \cs{parindent} indentation +%is suppressed if \cs{parshape} is in effect. +Regular \cs{parindent}, \cs{leftskip}, +and \cs{rightskip} are still obeyed if \cs{parshape} is in effect. + +The \cs{parshape} parameter is, like \cs{hangindent}, \cs{hangafter}, +and \cs{looseness} (see Chapter~\ref{line:break}), +cleared after a \cs{par} +command. Since every empty line generates a \cs{par} token, +one should not leave an empty line +between a paragraph shape (or hanging indentation) +declaration and the following paragraph. + +The control sequence +\alt +\cs{parshape} is an \gr{internal integer}: +its value is the number of lines $n$ with which +it was set. + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Centred last lines +\subsection{Centred last lines} + +Equal stretch and shrink amounts for the \cs{leftskip} and +\cs{rightskip} +give centred texts, in the sense that each line is +centred. +For proper centring of the first +and last lines of a paragraph the \cs{parindent} and +\cs{parfillskip} have to be made zero. +However, the margins are ragged. + +A surprising application of \cs{leftskip} and \cs{rightskip} +\mdqon +\howto Centre the first/""last line of a paragraph\par +\mdqoff +leads to paragraphs with flush margins and a centred +last line. +\begin{verbatim} +\leftskip=0cm plus 0.5fil \rightskip=0cm plus -0.5fil +\parfillskip=0cm plus 1fil +\end{verbatim} + +For all lines of a paragraph but the +last one the stretch components +add up to zero so the \cs{leftskip} and \cs{rightskip} +inserted are zero. +On the last line the \cs{parfillskip} adds \hbox{\n{plus 1fil}} +of stretch; therefore there is a total of +\hbox{\n{plus 0.5fil}} of stretch at both the left and right +end of the line. + +It would have been incorrect to specify +\begin{verbatim} +\leftskip=0cm plus 0.5fil \rightskip=0cm minus 0.5fil +\end{verbatim} +\TeX\ gives an error about this: it complains about +`infinite shrinkage'. + +Centring not only the last line, but also the +first line of a paragraph can be done by +the parameter settings +\begin{verbatim} +\parindent=0pt \everypar{\hskip 0pt plus -1fil} +\leftskip=0pt plus .5fil +\rightskip=0pt plus -.5fil +\end{verbatim} +This time a horizontal skip inserted by \cs{everypar} +combines with the \cs{leftskip} to give the same +amount of stretchability on both sides of the +first line of the paragraph. + +%\spoint Indenting into the margin +\subsection{Indenting into the margin} + +Suppose you want a hanging indent of \n{1cm} {\sl into\/} +\howto Indent into the margin\par +the left margin after the first two lines of a paragraph. +Specifying \verb/\hangindent=-1cm/ will give +a hanging indentation of one centimetre from the {\sl right\/} +margin, so another approach is necessary. The following does the +job: +\begin{verbatim} + \leftskip=-1cm \hangindent=1cm \hangafter=-2 +\end{verbatim} +The only problem with this is that +the leftskip needs to be reset after the paragraph. +Suitable redefinition of \cs{par} removes this objection: +\begin{verbatim} +\def\hangintomargin{\bgroup + \leftskip=-1cm \hangindent=1cm \hangafter=-2 + \def\par{\endgraf\egroup}} +\end{verbatim} +The redefinition of \cs{par} is here local to the paragraph that +should be outdented. + +Another, elegant, solution uses \cs{parshape}: +\begin{verbatim} + +\dimen0=\hsize \advance\dimen0 by 1cm +\parshape=3 % three lines: + 0cm\hsize % first line specification + 0cm\hsize % second line specification + -1cm\dimen0 % third line specification +\end{verbatim} + +%\spoint Hang a paragraph from an object +\subsection{Hang a paragraph from an object} + +The \LaTeX\ format has a macro, \cs{@hangfrom}, to have +\howto Hang a paragraph from an object\par +one paragraph of text hanging from some object, usually a box +or a short line of text. + +\begingroup +\medskip +\def\hangobject{Example \ } +\setbox0=\hbox{\hangobject} +\hangindent \wd0 \noindent \hangobject +This paragraph is an example of the \cs{hangfrom} macro +defined below. +In the \LaTeX\ document +styles, the \cs{@hangfrom} macro (which is similar to this) +is used for multi-line section headings.\par +\endgroup + +Consider then the macro \cs{hangfrom}: +\begin{verbatim} + +\def\hangfrom#1{\def\hangobject{#1}\setbox0=\hbox{\hangobject}% + \hangindent \wd0 \noindent \hangobject \ignorespaces} +\end{verbatim} +Because of the default \cs{hangafter=1}, this +will produce one line of width \cs{hsize}, after which the +rest of the paragraph will be left indented by the width of the +\cs{hangobject}. + +%\spoint Another approach to hanging indentation +\subsection{Another approach to hanging indentation} + +Hanging indentation can also be attained by a combination +of shifting the left margin and outdenting. +Itemized lists can for instance be implemented in this manner: +\begin{verbatim} +\newdimen\listindent +\def\itemize{\begingroup + \advance\leftskip by \listindent + \parindent=-\listindent} +\def\stopitemize{\par\endgroup} +\def\item#1{\par\leavevmode + \hbox to \listindent{#1\hfil}\ignorespaces + } +\end{verbatim} +If an item should encompass more than one paragraph, the +implementation could be +\begin{verbatim} +\newdimen\listindent \newdimen\listparindent +\def\itemize{\begingroup + \advance\leftskip by \listindent + \parindent=\listparindent} +\def\stopitemize{\par\endgroup} +\def\item#1{\par\noindent + \hbox to 0cm{\kern-\listindent #1\hfil}\ignorespaces + } +\end{verbatim} + +\begin{example} +\begin{verbatim} +\itemize\item{1.}First item\par +Is two paragraphs long. +\item{2.}Second item.\stopitemize +\end{verbatim} +gives +\begin{disp} +\def\itemize{\begingroup + \advance\leftskip by \parindent + \parindent=1em\relax} +\def\stopitemize{\par\endgroup} +\def\item#1{\par\noindent + \hbox to 0cm{\kern-\parindent #1\hfil}\ignorespaces + } +\itemize\item{1.}First item\par +Is two paragraphs long. +\item{2.}Second item.\stopitemize +\end{disp} +\end{example} + +%\spoint Hanging indentation versus \cs{leftskip} shifting +\subsection{Hanging indentation versus \cs{leftskip} shifting} + +From the above examples it would seem that +hanging indentation and modifying the \cs{leftskip} and \cs{rightskip} +are interchangeable. They are, but only to a certain extent. +\altt + +Setting \cs{leftskip} to some positive value for a paragraph +means that the \cs{hsize} stays the same, but every line +starts with a glue item. Hanging indentation, on the other hand, +is implemented by decreasing the \cs{hsize} value for the +lines that hang, and shifting the finished +horizontal boxes horizontally in the surrounding vertical list. + +The difference between the two approaches becomes visible +mainly in the fact that display formulas are not shifted +when the \cs{leftskip} is altered. +See Chapter~\ref{rules} for an example showing how leaders +are affected by margin shifting. + +%\spoint More examples +\subsection{More examples} + +Some more examples of paragraph shapes (effected by +various means) can be found in~\cite{E1}. One example +from that article appears on page~\pageref{varioset}. + +%\subject[line:break] Line Breaking +\endofchapter +\chapter{Line Breaking}\label{line:break} + +This chapter treats line breaking and the concept of `badness' that \TeX\ +uses to decide how to break a paragraph into lines, +or where to break a page. +The various penalties contributing to the cost of line breaking +are treated here, as is hyphenation. +Page breaking is treated in Chapter~\ref{page:break}. + +\begin{inventory} +\item [\cs{penalty}] + Specify desirability of not breaking at this point. + +\item [\cs{linepenalty}] + Penalty value associated with each line break. + Plain \TeX\ default:~\n{10}. + +\item [\cs{hyphenpenalty}] + Penalty associated with break at a discretionary item + in the general case. + Plain \TeX\ default:~\n{50}. + +\item [\cs{exhyphenpenalty}] + Penalty for breaking a horizontal line at a discretionary + item in the special case where the prebreak text is empty. + Plain \TeX\ default:~\n{50}. + +\item [\cs{adjdemerits}] + Penalty for adjacent visually incompatible lines. + Plain \TeX\ default:~\n{10$\,$000}. + +\item [\cs{doublehyphendemerits}] + Penalty for consecutive lines ending with a hyphen. + Plain \TeX\ default:~\n{10$\,$000}. + +\item [\cs{finalhyphendemerits}] + Penalty added when the penultimate line of a + paragraph ends with a hyphen. + Plain \TeX\ default:~\n{5000}. + +\item [\cs{allowbreak}] + Macro for creating a breakpoint by inserting a + \cs{penalty0}. + +\item [\cs{pretolerance}] + Tolerance value for a paragraph without hyphenation. + Plain \TeX\ default:~\n{100}. + +\item [\cs{tolerance}] + Tolerance value for lines in a paragraph with hyphenation. + Plain \TeX\ default:~\n{200}. + +\item [\cs{emergencystretch}] + (\TeX3 only) + Assumed extra stretchability in lines of a paragraph. + +\item [\cs{looseness}] + Number of lines by which this paragraph has to be made longer + than it would be ideally. + +\item [\cs{prevgraf}] + The number of lines in the paragraph last + added to the vertical list. + +\item [\cs{discretionary}] + Specify the way a character sequence is split up at a line break. + +\item [\cs{-}] + Discretionary hyphen; this is + equivalent to \verb|\discretionary{-}{}{}|. + +\item [\cs{hyphenchar}] + Number of the hyphen character of a font. + +\item [\cs{defaulthyphenchar}] + Value of \cs{hyphenchar} when a font is loaded. + Plain \TeX\ default:~\n{`\cs{-}}. + +\item [\cs{uchyph}] + Positive to allow hyphenation of words starting with a capital + letter. + Plain \TeX\ default:~\n{1}. + +\item [\cs{lefthyphenmin}] + (\TeX3 only) + Minimal number of characters before a hyphenation. + Plain \TeX\ default:~\n{2}. + +\item [\cs{righthyphenmin}] + (\TeX3 only) + Minimum number of characters after a hyphenation. + Plain \TeX\ default:~\n{3}. + +\item [\cs{patterns}] + Define a list of hyphenation patterns for the current + value of \cs{language}; allowed only in \IniTeX. + +\item [\cs{hyphenation}] + Define hyphenation exceptions for the current value of \cs{language}. + +\item [\cs{language}] + Choose a set of hyphenation patterns and exceptions. + +\item [\cs{setlanguage}] + Reset the current language. + +\end{inventory} + + +%\point Paragraph break cost calculation +\section{Paragraph break cost calculation} + +A paragraph is broken such that the amount $d$ of {\em demerits\/} +associated with breaking it is minimized. +The total amount of demerits for a paragraph is the sum +of those for the individual lines, plus possibly some extra +penalties. Considering a paragraph as a whole instead of +breaking it on a line-by-line basis can lead to better +line breaking: \TeX\ can choose to take a slightly less beautiful +line in the beginning of the paragraph in order to avoid +bigger trouble later on. + +For each line demerits are calculated from the {\em badness\/}~$b$ +of stretching or shrinking the line to the break, and +the {\em penalty\/}~$p$ associated with the break. +The badness is not allowed to exceed a certain prescribed +tolerance. + +In addition to the demerits for breaking individual lines, +\TeX\ assigns demerits for the way lines combine; see below. + +The +\mdqon +implementation of \TeX's paragraph"-breaking algorithm +\mdqoff +is explained in~\cite{K:break}. + +%\spoint Badness +\subsection{Badness} + +From the ratio between the stretch or shrink present in a +\term badness! and line breaking\par\term line breaking!badness\par +line, and the actual stretch or shrink taken, +the `badness' of breaking a line at a certain point is calculated. +This badness is an important +factor in the process of line breaking. +See page~\pageref{bad:form} for the formula for badness. + +In this chapter +badness will only be discussed in the context of line breaking. +Badness is also computed when a vertical list is stretched +or shrunk (see Chapter~\ref{page:break}). + +The following terminology is used to describe badness: +\begin{description} \item [tight (3)] +is any line that has shrunk with a badness~$b\geq13$, +that is, by using at least one-half of its amount of shrink +(see page~\pageref{bad:form} for the computation). +\item [decent (2)] +is any line with a badness~$b\leq12$. +\item [loose (1)] +is any line that has stretched with a badness~$b\geq13$, +that is, by using at least one-half of its amount of stretch. +\item [very loose (0)] +is any line that has stretched with a badness~$b\geq100$, +that is, by using its full amount of stretch or more. Recall +that glue can stretch, but not shrink more than its +allowed amount. +\end{description} +The numbering is used in trace output (Chapter~\ref{trace}), and +it is also used in the following definition: +if the classifications of two adjacent lines differ by more than~1, +the lines are said to be {\em visually incompatible\/}. +See below for the \cs{adjdemerits} parameter associated with this. + +Overfull horizontal and vertical +boxes are passed unnoticed if their excess width +or height is less than \cs{hfuzz} or \cs{vfuzz} respectively; +they are not reported if the badness is less than +\cs{hbadness} or \cs{vbadness} (see Chapter~\ref{boxes}). + +%\spoint Penalties and other break locations +\subsection{Penalties and other break locations} + +Line breaks can occur at the following places in horizontal +\cstoidx penalty\par +\term lists !horizontal! breakpoints in\par +\term lists !horizontal! penalties in \par +lists: +\begin{enumerate} \item At a penalty. The penalty value is the +`aesthetic cost' of breaking the line at that place. +Negative penalties are considered as bonuses. +A~penalty of $10\,000$ or more inhibits, and a penalty +of $-10\,000$ or less forces, a~break. + +Putting more than one penalty +in a row is equivalent to putting just the one with the +minimal value, because that one is the best candidate for line breaking. + +Penalties in horizontal mode are inserted by the user (or a +user macro). The only exception is the \cs{nobreak} +inserted before the \cs{parfillskip} glue. + +\item At a glue, if it is not part of a math formula, and +if it is preceded by a non-discardable item (see Chapter~\ref{hvmode}). +There is no penalty associated with breaking at glue. + +The condition about the non-discardable precursor is necessary, +because otherwise breaking in between two pieces of glue would +be possible, which would cause ragged edges to the paragraph. + +\item At a kern, if it is not part of a math formula +and if it is followed by glue. +There is no penalty associated with breaking at a~kern. + +\item At a math-off, if that is followed by glue. +Since math-off +(and math-on) act as kerns (see Chapter~\ref{math}), +this is very much like the previous case. +There is no penalty associated with breaking at a~math-off. + +\item At a discretionary break. The penalty +is the \cs{hyphenpenalty} or the \cs{exhyphenpenalty}. +This is treated below. +\end{enumerate} + +Any discardable material following the break \ldash glue, kerns, +\mdqon +math-on/""off and penalties \rdash is discarded. If one considers +\mdqoff +a line break at glue (kern, math-on{/}off) to occur at the +front end of the glue item, this implies that that piece +of glue disappears in the break. + +%\spoint Demerits +\subsection{Demerits} + +From the badness of a line and the penalty, if any, the demerits +of the line are calculated. Let $l$ be the value of +\csidx{linepenalty}, $b$~the badness of the line, +$p$~the penalty at the break; then the demerits $d$ +\term demerits\par +are given by +\begin{disp}$\displaystyle d=\cases{(l+b)^2+p^2&if $0\leq p<10\,000$\cr + (l+b)^2-p^2&if $-10\,000<p<0$\cr + (l+b)^2 &if $p\leq-10\,000$\cr}$\end{disp} + +Both this formula and the one for the badness are described +\alt +in \cite{K:break} as `quite arbitrary', +but they have been shown to lead to +good results in practice. + +The demerits for a paragraph are the sum of the demerits for +the lines, plus \begin{itemize} +\item the \csidx{adjdemerits} for any two + adjacent lines that are not visually compatible (see above), +\item \csidx{doublehyphendemerits} for any two + consecutive lines ending with a hyphen, and the +\item \csidx{finalhyphendemerits} + if the penultimate line of a paragraph + ends with a hyphen.\end{itemize} + +At the start of a paragraph \TeX\ acts as if +there was a preceding line which was `decent'. +Therefore \cs{adjdemerits} will be added if the first +line is `very loose'. Also, the last line +of a paragraph is ordinarily also `decent' +\ldash all spaces are set at natural width +owing to the infinite stretch in the \cs{parfillskip} \rdash +so \cs{adjdemerits} are added if +the preceding line is `very loose'. + +Note that the penalties at which a line break +is chosen weigh about as heavily as the badness of +the line, so they can be relatively small. +However, the three extra demerit parameters +have to be of the order of the square of +penalties and badnesses to weigh equally heavily. + +%\spoint The number of lines of a paragraph +\subsection{The number of lines of a paragraph} + +After a paragraph has been completed (or partially +completed prior to a display), the variable \csidx{prevgraf} +records the number of lines in the paragraph. +By assigning to this variable \ldash and +because this is a \gr{special integer} +such an assignment is automatically global \rdash +\TeX's decision processes can be influenced. +This may be useful in combination with hanging indentation +or \cs{parshape} specifications (see Chapter~\ref{par:shape}). + +\mdqon +Some direct influence of the line"-breaking process +\mdqoff +on the resulting number of lines exists. One factor +is the \cs{linepenalty} which is included in the demerits +of each line. By increasing the line penalty \TeX\ can be +made to minimize the number of lines in a paragraph. + +Deviations from the optimal number of lines, that is, the +number of lines stemming from the optimal way of breaking a +paragraph into lines, can be forced by the user by means +of the \csidx{looseness} parameter. This parameter, which is +reset every time the shape parameters +are cleared (see Chapter~\ref{par:shape}), +indicates by how many lines the current +paragraph should be made longer than is optimal. A~negative +value of \cs{looseness} will attempt to make the paragraph shorter +by a number of lines that is the absolute value of the parameter. + +\TeX\ will still observe the values +of \cs{pretolerance} and \cs{tolerance} (see below) +when lengthening or shortening a paragraph under influence +of \cs{looseness}. +Therefore, +\TeX\ will only lengthen or shorten a paragraph for as far +as is possible without exceeding these parameters. + + +%\spoint[between:lines] Between the lines +\subsection{Between the lines} +\label{between:lines} + +\TeX's +paragraph mechanism packages lines into horizontal boxes +that are appended to the surrounding vertical list. +The resulting sequence of vertical items is then a +repeating sequence of +\begin{itemize}\item a box containing a line of text, +\item possibly migrated vertical material (see page~\pageref{migrate}), +\item a penalty item reflecting the cost of a page break + at that point, which is normally the \cs{interlinepenalty} + (see Chapter~\ref{page:break}), and +\item interline glue, which is calculated automatically + on basis of the \cs{prevdepth} (see Chapter~\ref{baseline}). +\end{itemize} + +%\point The process of breaking +\section{The process of breaking} + +\TeX\ tries to break paragraphs in such a way that +\term paragraph! breaking into lines\par +the badness of each line does not exceed a certain tolerance. +If there exists more than one solution to this, the one with +the fewest demerits is taken. + +By setting \csidx{tracingparagraphs} to a positive value, +\TeX\ can be made to report the calculations of the +paragraph mechanism in the log file. Some implementations of \TeX\ +may have this option disabled to make \TeX\ run faster. + +%\spoint Three passes +\subsection{Three passes} + +First an attempt is made to split the paragraph into lines +without hyphenating, that is, without inserting discretionary +hyphens. This attempt succeeds if none of the +lines has a badness exceeding \csidx{pretolerance}. + +Otherwise, a second pass is made, inserting discretionaries +and using \csidx{tolerance}. +If \cs{pretolerance} is negative, the first pass is omitted. + +\TeX\ can be made to make a third pass if the first and +second pass fail. +If \csidx{emergencystretch} is a positive dimension, +\TeX\ will assume this much extra stretchability +in each line when badness and demerits are calculated. +Thus solutions that only slightly exceeded the given +tolerances will now become feasible. +However, no glue of size \cs{emergencystretch} is +actually present, so underfull box messages +may still occur. + +%\spoint Tolerance values +\subsection{Tolerance values} + +How much +trouble \TeX\ will have typesetting a piece of text +depends partly on the tolerance value. +Therefore it is sensible to have some idea of +what badness values mean in visual terms. + +For lines that are stretched, the badness is +100 times the cube of the stretch ratio. +A~badness of 800 thus means that the stretch ratio +is~2. +If the space is, +\alt +as in the ten-point Computer Modern Font, +\begin{verbatim} +3.33pt plus 1.67pt minus 1.11pt +\end{verbatim} +a badness of 800 means that spaces have been stretched to +\begin{disp} \n{3.33pt}${}+2\times{}$\n{1.67pt}${}={}$\n{6.66pt}\end{disp} +that is, to exactly double their natural size. +It is up to you to decide whether this is too large. + +%\point Discretionaries +\section{Discretionaries} + +A discretionary item \verb-\discretionary{..}{..}{..}- +\term discretionary item\par\cstoidx discretionary\par +marks a place where a word can be broken. +Each of the three arguments is a \gr{general text} +(see Chapter~\ref{gramm}): +they are, in sequence, +\begin{itemize} \item the {\em pre-break\/} text, which is appended +to the part of the word before the break, +\item the {\em post-break\/} text, which is prepended to the part +of the word after the break, and +\item the {\em no-break\/} text, which is used if the word +is not broken at the discretionary item.\end{itemize} +For example: \verb>ab\discretionary{g}{h}{cd}ef> +is the word \hbox{\n{abcdef}}, but it can be hyphenated +\alt +with \n{abg} before the break and \n{hef} after. +Note that there is no automatic hyphen character. + +All three texts may contain any sorts of tokens, +but any primitive commands and macros +should expand to boxes, kerns, and characters. + +%\spoint Hyphens and discretionaries +\subsection{Hyphens and discretionaries} + +Internally, \TeX\ inserts the equivalent of +\cstoidx hyphenchar\par\term character !hyphen\par +\begin{verbatim} +\discretionary{\char\hyphenchar\font}{}{} +\end{verbatim} +at every place where a word can be broken. No +such discretionary is inserted if \verb>\hyphenchar\font> +is not in the range 0--255, or if its position in the +font is not filled. +When a font is loaded, its \cs{hyphenchar} value +is set to \csidx{defaulthyphenchar}. The \cs{hyphenchar} +value can be changed after this. + +In plain \TeX\ the \cs{defaulthyphenchar} has the value~\verb>`\->, so +for all fonts character~45 (the \ascii\ hyphen character) +is the hyphen sign, unless +it is specified otherwise. + +The primitive command \verb|\-| (called a `discretionary hyphen') +\csterm -\par\term discretionary hyphen\par +is equivalent to the above +\verb|\discretionary{\char\hyphenchar\font}{}{}|. +Breaking at such a discretionary, whether inserted implicitly +by \TeX\ or explicitly by the user, has +a cost of \csidx{hyphenpenalty}. + + +In unrestricted horizontal mode an empty discretionary +\cs{disc\-re\-tio\-na\-ry}\verb-{}{}{}- +is automatically inserted after characters +whose character code is the \cs{hyphenchar} value +of the font, thus enabling hyphenation at that point. +The penalty for breaking a line at +such a discretionary with an empty pre-break text +is \csidx{exhyphenpenalty}, that is, the `explicit hyphen' penalty. + +If a word contains +discretionary breaks, for instance +because of explicit hyphen characters, +\TeX\ will not consider it for further hyphenation. +People have solved the ensuing problems by tricks +such as +\howto Enable hyphenation of a word containing a hyphen\par +\begin{verbatim} +\def\={\penalty10000 \hskip0pt -\penalty0 \hskip0pt\relax} +... integro\=differential equations... +\end{verbatim} +The skips before and after the hyphen lead \TeX\ into +treating the first and second half of the +compound expression as separate words; the penalty +before the first skip inhibits breaking before the hyphen. + +%\spoint Examples of discretionaries +\subsection{Examples of discretionaries} + +Languages such as German or Dutch have words that change +\term languages\par +spelling when hyphenated (German: `\hbox{backen}' +becomes `\hbox{bak-ken}'; Dutch: `\hbox{autootje}' +becomes `\hbox{auto-tje}'). This problem can be solved +with \TeX's discretionaries. + +For instance, for German (this is inspired by~\cite{Partl}): +\begin{verbatim} +\catcode`\"=\active +\def"#1{\ifx#1k\discretionary{k-}{k}{ck}\fi} +\end{verbatim} +which enables the user to write \verb>ba"ken>. + +In Dutch there is a further problem which allows a nice +systematic solution. Umlaut characters (`trema' is the +Dutch term) should often +disappear in a break, for instance `\hbox{na"apen}' +hyphenates as `\hbox{na-apen}', and `\hbox{onbe"invloedbaar}' +hyphenates as `\hbox{onbe-invloedbaar}'. A solution +(inspired by~\cite{Babel}) is +\begin{verbatim} +\catcode`\"=\active +\def"#1{\ifx#1i\discretionary{-}{i}{\"\i}% + \else \discretionary{-}{#1}{\"#1}\fi} +\end{verbatim} +which enables the user to type \verb>na"apen> and +\verb>onbe"invloedbaar>. + +%\point Hyphenation +\section{Hyphenation} + +\TeX's hyphenation algorithm uses a list of patterns to +\term hyphenation\par +determine at what places a word that is a candidate for +hyphenation can be broken. +Those aspects of hyphenation connected with these +patterns are +treated in appendix~H of \TeXbook; +the method of generating hyphenation patterns automatically +is described in~\cite{Liang}. People have been known +to generate lists of patterns by hand; +see for instance~\cite{Vas:add}. Such hand-generated lists +may be superior to automatically generated lists. + +Here it will mainly be described how \TeX\ declares a word to +be a candidate for hyphenation. The problem here is +how to cope with punctuation and things such as quotation marks +that can be attached to a word. Also, {\em implicit kerns\/}, +that is, kerns inserted because of font information, +must be handled properly. + +%\spoint Start of a word +\subsection{Start of a word} + +\TeX\ starts at glue items (if they are not in math mode) +looking for a {\em starting letter\/} of a word: +a character with non-zero \cs{lccode}, or a ligature starting +\mdqon +with such a character (upper/""lowercase codes are explained +\mdqoff +on page~\pageref{uc/lc}). +Looking for this starting letter, +\TeX\ bypasses any implicit kerns, and +characters with zero \cs{lccode} (this includes, +for instance, punctuation and quotation marks), +or ligatures starting with +such a character. + +If no suitable starting letter turns up, that is, if +something is found that is not a character or ligature, +\TeX\ skips to the next glue, and starts this algorithm anew. +Otherwise a trial word is collected consisting of +all following characters with non-zero \cs{lccode} +from the same font as the starting letter, or ligatures consisting +completely of such characters. Implicit kerns are allowed +between the characters and ligatures. + +If the starting letter is from a font for which the value +of \cs{hyphenchar} is invalid, or for which this character +does not exist, hyphenation is abandoned for this word. +If the starting letter is an uppercase letter (that is, +it is not equal to its own \cs{lccode}), \TeX\ will +abandon hyphenation unless \csidx{uchyph} is positive. +The default value for this parameter is~1 in +plain \TeX, +implying that capitalized words are subject to hyphenation. + +%\spoint End of a word +\subsection{End of a word} + + +Following the trial word can be characters (from another +font, or with zero \cs{lccode}), ligatures or implicit kerns. +After these items, if any, must follow +\begin{itemize}\item glue or an explicit kern, +\item a penalty, +\item a whatsit, or +\item a \cs{mark}, \cs{insert}, or \cs{vadjust} item. +\end{itemize} +In particular, the word will not be hyphenated if it is +followed by a \begin{itemize}\item box, \item rule, \item math +formula, or \item discretionary item.\end{itemize} + +Since discretionaries are inserted after the \cs{hyphenchar} +of the font, occurrence of this character inhibits further +hyphenation. Also, placement of accents is implemented using +explicit kerns (see Chapter~\ref{char}), so any \cs{accent} +command is considered to be the end of a word, and inhibits +hyphenation of the word. + +%\spoint \TeX2 versus \TeX3 +\subsection{\TeX2 versus \TeX3} + +There is a noticeable difference in the treatment of +\term \TeX\ version 3\par +hyphenated fragments between \TeX2 and \TeX3. +\TeX2 insists that the part before the break should be +at least two characters, and the part after the break three +characters, long. +Typographically this is a sound decision: this way +there are no two-character pieces of a word stranded at the +end or beginning of the line. Both before and after the break +there are at least three characters. + +In \TeX3 two integer parameters have been introduced to control +the length of these fragments: +\csidx{lefthyphenmin} and \csidx{righthyphenmin}. These are +set to 2 and~3 respectively in the plain format for \TeX3. +If the sum of these two is 63 or more, all hyphenation is +suppressed. + +Another addition in \TeX3, +the possibility to have several sets of hyphenation patterns, +is treated below. + +%\spoint Patterns and exceptions +\subsection{Patterns and exceptions} + +The statements \begin{disp}\cs{patterns}\gr{general text}\nl +\csidx{hyphenation}\gr{general text}\end{disp} +are \gr{hyphenation assignment}s, which are +\gr{global assignment}s. +The \csidx{patterns} command, which specifies a list +of hyphenation patterns, is allowed only in \IniTeX\ +(see Chapter~\ref{TeXcomm}), +and all patterns must be specified before the first +paragraph is typeset. + +Hyphenation exceptions can be specified at any time +\howto Specify exceptional hyphenations\par +with statements such as +\begin{verbatim} +\hyphenation{oxy-mo-ron gar-goyle} +\end{verbatim} +which specify locations where a word may be hyphenated. +Subsequent \cs{hyphenation} statements are cumulative. + +In \TeX3 these statements are taken to hold for the +language that is the current value of the \cs{language} +parameter. + +%\point Switching hyphenation patterns +\section{Switching hyphenation patterns} + +When typesetting paragraphs, \TeX\ (version~3) can use several +\alt +\term language\par +sets of patterns and hyphenation exceptions, for at most 256 +languages. + +If a \cs{patterns} or \cs{hyphenation} +command is given (see above), \TeX\ stores the patterns or exceptions +under the current value of the \csidx{language} parameter. +The \cs{patterns} command is only allowed in \IniTeX, and +patterns must be specified before any typesetting is done. +Hyphenation exceptions, however, can +be specified cumulatively, and not only in \IniTeX. + +In addition to the \cs{language} parameter, +\term language !current\par +which can be set by the user, \TeX\ has internally a `current +language'. This is set to zero at the start of every paragraph. +For every character that is added to a paragraph +the current language is compared with the value of \cs{language}, +and if they differ a whatsit element is added to the horizontal +list, resetting the current language to the value of \cs{language}. + +At the start of a paragraph, this whatsit is inserted +\altt +after the \cs{everypar} tokens, but \cs{lastbox} +can still access the indentation box. + +As an example, suppose that a format has been created such that +language~0 is English, and language~1 is Dutch. English hyphenations +will then be used if the user does not specify otherwise; +if a job starts with \begin{verbatim} +\language=1 +\end{verbatim} +the whole document +will be set using Dutch hyphenations, because \TeX\ will insert +a command changing the current language at the start of +every paragraph. For example: +\begin{verbatim} +\language=1 +T... +\end{verbatim} +gives +\begin{verbatim} +.\hbox(0.0+0.0)x20.0 % indentation +.\setlanguage1 (hyphenmin 2,3) % language whatsit +.\tenrm T % start of text +\end{verbatim} + +The whatsit can be inserted explicitly, without changing +the value of \csidx{language}, by specifying +\begin{disp}\cs{setlanguage}\gr{number}\end{disp} +However, this will hardly ever be needed. +One case where it may be necessary is when the contents of +a horizontal box are unboxed to a paragraph: inside the box no +whatsits are added automatically, since inside such a box +no hyphenation can take place. +See page~\pageref{wide:vbox} for another problem with text +in horizontal boxes. + +%%%% end of input file [par] + +%\InputFile:space +%%%% this is input file [space] +%\subject[space] Spacing +\endofchapter +\chapter{Spacing}\label{space} + +The usual interword space in \TeX\ is specified in the +\term spacing\par +font information, but the user can override this. +This chapter explains the rules by which +\TeX\ calculates interword space. + +\begin{inventory} + +\item [\cs{\char32}] + Control space. + Insert the same amount of space as a space token would + if \cs{spacefactor}${}=1000$. + +\item [\cs{spaceskip}] + Interword glue if non-zero. + +\item [\cs{xspaceskip}] + Interword glue if non-zero and \cs{spacefactor}${}\geq2000$. + +\item [\cs{spacefactor}] + 1000 times the ratio by which the stretch (shrink) component of the + interword glue should be multiplied (divided). + +\item [\cs{sfcode}] + Value for \cs{spacefactor} associated with a character. + +\item [\cs{frenchspacing}] + Macro to switch off extra space after punctuation. + +\item [\cs{nonfrenchspacing}] + Macro to switch on extra space after punctuation. + +\end{inventory} + + +\section{Introduction} + +In between words in a text, \TeX\ inserts space. This space has a +natural component, plus stretch and shrink to make justified +(right-aligned) text possible. Now, in certain styles of typesetting, +there is more space after punctuation. This chapter discusses the +mechanism that \TeX\ uses to realize such effect. + +Here is the general idea: +\begin{itemize} +\item After every character token, the \cs{spacefactor} quantity is + updated with the space factor code of that character. +\item When space is inserted, its natural size can be augmented + (if \cs{spacefactor}${}\geq2000$), and in general its stretch is + multiplied, and its shrink divided, by \cs{spacefactor}${}/1000$. +\item There are further rules, for instance so that in \n{...word.) + And...} the space is modified according to the period, not the + closing parenthesis. +\end{itemize} + +%\point Automatic interword space +\section{Automatic interword space} + + +For every space token in horizontal mode the interword glue +of the current font +is inserted, with stretch and shrink components, all +determined by \cs{fontdimen} parameters. +To be specific, font dimension~2 is the normal interword space, +dimension~3 is the amount of stretch of the interword +space, and 4~is the amount of shrink. Font dimension +7 is called the `extra space'; see below (the list +of all the font dimensions appears on page~\pageref{font:dims}). + +Ordinarily all spaces between words (in one font) would be treated +the same. To allow for differently sized spaces \ldash for instance +a typeset equivalent of the double spacing after +punctuation in typewritten documents \rdash +\term space! factor\par +\TeX\ associates with each character a so-called `space factor'. + +When a character is added to the current horizontal list, +the space factor code (\csidx{sfcode}) +of that character +is assigned to the space factor \csidx{spacefactor}. +There are two exceptions to this rule: +\begin{itemize} +\item When the space factor code is zero, the \cs{spacefactor} does + not change. This mechanism allows space factors to persist through + parentheses and such; see section~\ref{sec:sf-through-paren}. +\item When the space factor code of the last character is ${>}1000$ + and the current space factor is ${<}1000$, the space factor + becomes~1000. This mechanism prevents elongated spaces after + initials; see section~\ref{sec:sf-punct}. +\end{itemize} +The maximum space factor is~$32\,767$. + +The stretch component of the interword space is +multiplied by the space factor divided by 1000; +the shrink component is divided by this factor. +The extra space (font dimension~7) is +added to the natural component of the +interword space when the space factor is~${}\geq2000$. + +%\point User interword space +\section{User interword space} + +The user can override the interword space contained in +the \cs{fontdimen} parameters +by setting the +\csidx{spaceskip} and the \csidx{xspaceskip} to non-zero values. +If \cs{spaceskip} is non-zero, it is taken instead +of the normal interword space +(\cs{fontdimen2} plus \cs{fontdimen3} minus \cs{fontdimen4}), but +a non-zero \cs{xspaceskip} is used as interword space if +the space factor is~${}\geq2000$. + +If the \cs{spaceskip} is used, +its stretch and shrink components are +multiplied and divided respectively by \cs{spacefactor}$/1000$. + +Note that, if \cs{spaceskip} and \cs{xspaceskip} are +defined in terms of \n{em}, they change with the font. + +\begin{example} Let the following macros be given: +\begin{verbatim} +\def\a.{\vrule height10pt width4pt\spacefactor=1000\relax} +\def\b.{\vrule height10pt width4pt\spacefactor=3000\relax} +\def\c{\vrule height10pt width4pt\relax} +\end{verbatim} + then + +%\begin{disp}\leavevmode\PopIndentLevel + +\hbox{% +$\vcenter{\snugbox{% +\begin{verbatim} +\vbox{ +\fontdimen2\font=4pt % normal space +\fontdimen7\font=3pt % extra space +\a. \b. \c\par +% zero extra space +\fontdimen7\font=0pt +\a. \b. \c\par +% set \spaceskip for normal space +\spaceskip=2\fontdimen2\font +\a. \b. \c\par +% set \xspaceskip +\xspaceskip=2pt +\a. \b. \c\par +} +\end{verbatim} +}}$% +% +\quad gives\quad +% +\message{Check snug and drop!}% +$\vcenter{\snugbox{\parindent0pt\parskip=0pt +\def\a.{\vrule height10pt width4pt\spacefactor=1000\relax} +\def\b.{\vrule height10pt width4pt\spacefactor=3000\relax} +\def\c{\vrule height10pt width4pt\relax} +\leavevmode\strut\par\hbox{}\hbox{} +% set the normal space and extra space +\fontdimen2\font=4pt \fontdimen7\font=3pt +\a. \b. \c\par \vskip2\baselineskip +% zero extra space +\fontdimen7\font=0pt +\a. \b. \c\par \vskip2\baselineskip +% set \spaceskip for normal space +\spaceskip=2\fontdimen2\font +\a. \b. \c\par \vskip2\baselineskip +% set \xspaceskip +\xspaceskip=2pt +\a. \b. \c\par \leavevmode\strut +}}$% +% +} +%\end{disp} + +In all of these lines the glue is set at natural width. In the first +line the high space factor value after \cs{b} causes the extra +space \cs{fontdimen7} to be added. If this is zero (second line), the +only difference between space factor values is the stretch/shrink +ratio. In the third line the \cs{spaceskip} is taken +for all space factor values. If the \cs{xspaceskip} is nonzero, +it is taken (fourth line) instead of the \cs{spaceskip} +for the high value of the space factor. +\end{example} + +%\point[tie] Control space and tie +\section{Control space and tie} +\label{tie} + +Control space, \csc{\char32}, is a horizontal command +which inserts a space, +\term control! space\par\term space !control~--\par\csidx{\char32} +acting as if the current space factor is~1000. +However, it does not affect the value of \cs{spacefactor}. + +Control space has two main uses. First, it is convenient to use after +a control sequence: \verb+\TeX\ is fun!+ +Secondly, it can be used after abbreviations when \cs{nonfrenchspacing} +(see below) is in effect. For example: +\begin{verbatim} +\hbox spread 9pt{\nonfrenchspacing + The Reverend Dr. Drofnats} +\end{verbatim} +gives +\begin{disp} \hbadness=10000 \leavevmode +\hbox spread 9pt{\nonfrenchspacing + The Reverend Dr. Drofnats}\end{disp} +while +\begin{verbatim} +\hbox spread 9pt{\nonfrenchspacing + The Reverend Dr.\ Drofnats} +\end{verbatim} +gives +\begin{disp} \hbadness=10000 \leavevmode +\hbox spread 9pt{\nonfrenchspacing + The Reverend Dr.\ Drofnats}\end{disp} +(The \n{spread 9pt} is used to make the effect more visible.) + +The active character (in the plain format) tilde,~\n{\char126}, +\term tie\par\term ~@\char126\par +uses control space: it is defined as +\begin{verbatim} +\catcode`\~=\active +\def~{\penalty10000\ } +\end{verbatim} +Such an active tilde is called a `tie'; it inserts an ordinary +amount of space, and prohibits breaking at this space. + + +%\point More on the space factor +\section{More on the space factor} + +%\spoint Space factor assignments +\subsection{Space factor assignments} + +The space factor of a particular character can be assigned as +\term spacefactor code\par\cstoidx sfcode\par +\begin{disp}\cs{sfcode}\gr{8-bit number}\gr{equals}\gr{number}\end{disp} + +\IniTeX\ assigns a space factor code of 1000 to all characters +\label{ini:sf}% +except uppercase characters; they get a space factor code of~999. +The plain format then assigns space factor codes greater than +1000 to various punctuation symbols, for instance +\verb-\sfcode`\.=3000-, which triples the stretch and shrink +after a full stop. Also, for all space factor values $\geq2000$ +the extra space is added; see above. + +%\spoint Punctuation +\subsection{Punctuation} +\label{sec:sf-punct} + +Because the space factor cannot jump from a value below 1000 +to one above, a punctuation symbol after an uppercase +character will not have the effect on the interword space +that punctuation after a lowercase character has. + +\begin{example}\begin{verbatim} +a% \sfcode`a=1000, space factor becomes 1000 +.% \sfcode`.=3000, spacefactor becomes 3000 + % subsequent spaces will be increased. + +A% \sfcode`A=999, space factor becomes 999 +.% \sfcode`.=3000, space factor becomes 1000 + % subsequent spaces will not be increased. +\end{verbatim} +\end{example} + +Thus, initials +are not mistaken for sentence ends. +If an uppercase character does end a sentence, for instance +\begin{verbatim} +... and NASA. +\end{verbatim} +there are several solutions: +\begin{verbatim} +... NASA\spacefactor=1000. +\end{verbatim} +or +\begin{verbatim} +... NASA\hbox{}. +\end{verbatim} +which abuses the fact that after +a box the space factor is set to~1000. +The \LaTeX\ macro \cs{@} is equivalent to the first +possibility. + +In the plain format two macros are defined that switch between +\term frenchspacing\par\cstoidx frenchspacing\par +\cstoidx nonfrenchspacing\par +uniform interword spacing and extra space after punctuation. +The macro \cs{frenchspacing} sets the space factor code +of all punctuation to~1000; the macro \cs{nonfrenchspacing} +sets it to values greater than~1000. + +Here are the actual definitions from \n{plain.tex}:\begin{verbatim} +\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m + \sfcode`\!\@m \sfcode`\:\@m + \sfcode`\;\@m \sfcode`\,\@m} +\def\nonfrenchspacing{\sfcode`\.3000 \sfcode`\?3000 + \sfcode`\!3000 \sfcode`\:2000 + \sfcode`\;1500 \sfcode`\,1250 } +\end{verbatim} +where \begin{verbatim} +\mathchardef\@m=1000 +\end{verbatim} +is given in the plain format. + +French spacing is a somewhat controversial issue: +\TeXbook\ acts as if non-French spacing +is standard practice in printing, but for instance in~\cite{Hart} +one finds `The space of the line should be used after +all points in normal text'. +Extra space after punctuation +may be considered a `typewriter habit', but this is +not entirely true. It used to be a lot more common +than it is nowadays, and there are rational arguments +against it: the full stop (point, period) at the end of a +sentence, where extra punctuation is most visible, +is rather small, so it carries some extra visual space + of its own above it. This book does not use extra space +after punctuation. + +%\spoint Other non-letters +\subsection{Other non-letters} +\label{sec:sf-through-paren} + +The zero value of the space factor code makes +characters that are not a letter and not punctuation +`transparent' for the space factor. + +\message{check break after Example} +\begin{example}\begin{verbatim} +a% \sfcode`a=1000, space factor becomes 1000 +.% \sfcode`.=3000, spacefactor becomes 3000 + % subsequent spaces will be increased. + +a% \sfcode`a=1000, space factor becomes 1000 +.% \sfcode`.=3000, space factor becomes 3000 +)% \sfcode`)=0, space factor stays 3000 + % subsequent spaces will be increased. +\end{verbatim} +\end{example} + +%\spoint Other influences on the space factor +\subsection{Other influences on the space factor} + +The space factor is 1000 when \TeX\ starts forming a +horizontal list, in particular after \cs{indent}, \cs{noindent}, +and directly after a display. It is also 1000 after +a \cs{vrule}, an accent, or a \gr{box} (in horizontal mode), but +it is not influenced by \cs{unhbox} or \cs{unhcopy} +commands. + +In the first column of a \cs{valign} the space factor of +the surrounding horizontal list is carried over; similarly, +after a vertical alignment the space factor is set to the +value reached in the last column. + +%%%% end of input file [space] + +%\InputFile:math +%%%% this is input file [math] +%\subject[mathchar] Characters in Math Mode +\endofchapter +\chapter{Characters in Math Mode}\label{mathchar} + +In math mode every character specifies by its +\cs{mathcode} what position of +a font to access, among other things. +For delimiters this story is a bit +more complicated. This chapter explains the concept +of math codes, and shows how \TeX\ implements variable +size delimiters. + +\begin{inventory} +\item [\cs{mathcode}] + Code of a character determining its treatment in math mode. + +\item [\cs{mathchar}] + Explicit denotation of a mathematical character. + +\item [\cs{mathchardef}] + Define a control sequence to be a synonym for + a~math character code. + +\item [\cs{delcode}] + Code specifying how a character should be used as delimiter. + +\item [\cs{delimiter}] + Explicit denotation of a delimiter. + +\item [\cs{delimiterfactor}] + 1000 times the fraction of a delimited formula that should be + covered by a delimiter. + Plain \TeX\ default:~\n{901} + +\item [\cs{delimitershortfall}] + Size of the part of a delimited formula that is allowed + to go uncovered by a delimiter. + Plain \TeX\ default:~\n{5pt} + +\item [\cs{nulldelimiterspace}] + Width taken for empty delimiters. + Plain \TeX\ default:~\n{1.2pt} + +\item [\cs{left}] + Use the following character as an open delimiter. + +\item [\cs{right}] + Use the following character as a closing delimiter. + +\item [\cs{big}] + One line high delimiter. + +\item [\cs{Big}] + One and a half line high delimiter. + +\item [\cs{bigg}] + Two lines high delimiter. + +\item [\cs{Bigg}] + Two and a half lines high delimiter. + +\item [\cs{bigl {\MainFont etc.}}] + Left delimiters. + +\item [\cs{bigm {\MainFont etc.}}] + Delimiters used as binary relations. + +\item [\cs{bigr {\MainFont etc.}}] + Right delimiters. + +\item [\cs{radical}] + Command for setting things such as root signs. + +\item [\cs{mathaccent}] + Place an accent in math mode. + +\item [\cs{skewchar}] + Font position of an after-placed accent. + +\item [\cs{defaultskewchar}] + Value of \cs{skewchar} when a font is loaded. + +\item [\cs{skew}] + Macro to shift accents on top of characters explicitly. + +\item [\cs{widehat}] + Hat accent that can + accommodate wide expressions. + +\item [\cs{widetilde}] + Tilde accent that can + accommodate wide expressions. + +\end{inventory} + +%\point Mathematical characters +\section{Mathematical characters} + +Each of the 256 permissible character codes has +\term math characters\par +an associated \csidx{mathcode}, which can be assigned by +\begin{disp}\cs{mathcode}\gr{8-bit number}\gr{equals}\gr{15-bit number}\end{disp} +When processing in math mode, \TeX\ replaces all characters of +categories 11 and~12, and \cs{char} and \cs{chardef} characters, +by their associated mathcode. + +The 15-bit math code is most conveniently denoted hexadecimally +as \verb-"xyzz-, where\begin{disp} +\n x${}\leq7$ is the class (see page~\pageref{math:class}),\nl +\n y is the font family number \alt +(see Chapter~\ref{mathfont}), and \nl +\n{zz} is the position of the character in the font.\end{disp} + +Math codes can also be specified directly by +\cstoidx mathchar\par\cstoidx mathchardef\par +a \gr{math character}, which can be\label{math:character} +\begin{itemize}\item\cs{mathchar}\gr{15-bit number}; +\item \gr{mathchardef token}, a control sequence that was defined by +\begin{disp}\cs{mathchardef}\gr{control sequence}\gr{equals}\gr{15-bit number} +\end{disp} + or +\item a delimiter command\alt +\begin{disp}\cs{delimiter}\gr{27-bit number}\end{disp} + where the last 12 bits +are discarded.\end{itemize} +The commands \cs{mathchar} and \cs{mathchardef} +are analogous to \cs{char} and \cs{char\-def} in text mode. +Delimiters are treated below. +A~\gr{mathchardef token} +can be used as a \gr{number}, even outside math mode. + +In \IniTeX\ all letters receive \cs{mathcode} \verb-"71zz- and +all digits receive \verb-"70zz-, where \verb-"zz- is the +hexadecimal position of the character in the font. +Thus, letters are initially from family~1 +(math italic in plain \TeX), and digits are from family~0 +(roman). +For all other characters, \IniTeX\ assigns +\begin{disp}\cs{mathcode}$\,x=x$,\end{disp} +thereby placing them also in family~0. + +If the mathcode is \verb-"8000-, +\label{mcode:8000}the smallest integer that is +not a \gr{15-bit number}, the character is treated as an active +character with the original character code. Plain \TeX\ +assigns a \cs{mathcode} of \verb-"8000- to the space, underscore and prime. + + +%\point Delimiters +\section{Delimiters} + +After \csidx{left} and \csidx{right} +\term delimiters\par +commands \TeX\ looks for a delimiter. A~delimiter +is either an explicit \cs{delimiter} command (or a +macro abbreviation for it), or a character with a non-zero +delimiter code. + +The \cs{left} and \cs{right} commands +implicitly delimit a group, which is considered as a subformula. +Since the enclosed formula can +be arbitrarily large, the quest for the proper delimiter is +a complicated story of looking at variants in two different +fonts, linked chains of variants in a font, and building +extendable delimiters from repeatable pieces. + +The fact that a group enclosed in \verb>\left...\right> is +treated as an independent subformula implies that a +sub- or superscript at the start of this formula is +not considered to belong to the delimiter. +For example, \TeX\ acts as if +\verb>\left(_2> is equivalent to \verb>\left({}_2>. +(A~subscript after a \cs{right} delimiter is positioned +with respect to that delimiter.) + +%\spoint[delcodes] Delimiter codes +\subsection{Delimiter codes } +\label{delcodes} + +To each character code there corresponds a delimiter +\cstoidx delcode\par\term delimiter codes\par +code, assigned by +\begin{disp}\cs{delcode}\gr{8-bit number}\gr{equals}% + \gr{24-bit number}\end{disp} +A delimiter code thus consists of six hexadecimal digits +\verb-"uvvxyy-, where\begin{disp} +\n{uvv} is the small variant of the delimiter, and\nl +\n{xyy} is the large variant;\nl +\n u, \n x are the font families of the variants, and\nl +\n{vv}, \n{yy} are the locations in those fonts.\end{disp} +Delimiter codes are used after \cs{left} and \cs{right} +commands. +\IniTeX\ sets all delimiter codes to~$-1$, +except\label{ini:del} +\verb-\delcode`.=0-, which makes the period an empty delimiter. +In plain \TeX\ delimiters have typically \n{u}${}=2$ and~\n{x}${}=3$, +that is, first family~2 is tried, and if no big +enough delimiter turns up family~3 is tried. + + +%\spoint Explicit \cs{delimiter} commands +\subsection{Explicit \cs{delimiter} commands} + +Delimiters can also be denoted +\cstoidx delimiter\par +explicitly by a \gr{27-bit number}, +\begin{verbatim} +\delimiter"tuvvxyy +\end{verbatim} +where \n{uvvxyy} are the small and large variant of the +delimiter as above; +the extra digit \n{t} (which is~$<8$) denotes the class +(see page~\pageref{math:class}). +For instance, the \cs{langle} macro is defined as +\begin{verbatim} +\def\langle{\delimiter "426830A } +\end{verbatim} +which means it belongs to class~4, opening. Similarly, +\cs{rangle} is of class~5, closing; and \cs{uparrow} is of class~3, +relation. + +After \cs{left} and \cs{right} \ldash that is, when \TeX\ +is looking for a delimiter \rdash the class digit is ignored; +otherwise \ldash when \TeX\ is not looking for a delimiter \rdash +the rightmost three digits are ignored, and the +four remaining digits are treated as a~\cs{mathchar}; see above. + +%\spoint[successor] Finding a delimiter; successors +\subsection{Finding a delimiter; successors} +\label{successor} + +Typesetting a delimiter is a somewhat involved affair. +\term delimiter sizes\par\term successors\par +First \TeX\ determines the size $y$ of the formula to be covered, +which is twice the maximum of the height and depth of the +formula. Thus the formula may not look optimal if +it is not centred itself. + +The size of the delimiter should be at least +\csidx{delimiterfactor}${}\times y/1000$ and at least +$y-{}$\csidx{delimitershortfall}. +\TeX\ then tries first the small variant, and if that one +is not satisfactory (or if the \n{uvv} part of the delimiter +is~\n{000}) it tries the large variant. If trying the large variant +does not meet with success, \TeX\ takes the largest delimiter +encountered in this search; if no delimiter at all was found +(which can happen if the \n{xyy} part is +\altt +also~\n{000}), +an empty box of width~\csidx{nulldelimiterspace} is taken. + +Investigating a variant means, in sequence, +\begin{itemize} \item if the current style (see page~\pageref{math:styles}) +is scriptscriptstyle +the \cs{scriptscriptfont} of the family is tried; +\item if the current style is scriptstyle or smaller +the \cs{scriptfont} of the family is tried; +\item otherwise the \cs{textfont} of the family is tried.\end{itemize} +The plain format puts the \verb-cmex10- font in all three +\term extension fonts\par +styles of family~3. + +Looking for a delimiter at a certain position in a certain font +means\begin{itemize}\item if the character is large enough, accept it; +\item if the character is extendable, accept it; +\item otherwise, if the character has a successor, that is, it is +part of a chain of increasingly bigger delimiters in the same +font, try the successor.\end{itemize} +Information about successors and extensibility of a delimiter +is coded in the font metric file of the font. +An extendable character has a top, a bottom, possibly a mid piece, +and a piece which is repeated directly below the top piece, and +directly above the bottom piece if there is a mid piece. + + +%\spoint \cs{big}, \cs{Big}, \cs{bigg}, and \cs{Bigg} +\subsection{\cs{big}, \cs{Big}, \cs{bigg}, and \cs{Bigg} +delimiter macros} + +In order to be able to use a delimiter outside the +\verb-\left...\right- context, or to specify a delimiter of +a different size than \TeX\ would have chosen, +four macros for `big' delimiters exist: \cs{big}, +\cs{Big}, \cs{bigg}, and \cs{Bigg}. These can be used with +anything that can follow \cs{left} or \cs{right}. + +Twelve further macros (for instance \cs{bigl}, \cs{bigm}, +\cstoidx big \rm etc.\par +%\csterm big \Style:roman etc.\par +and~\cs{bigr}) force such delimiters in the context of +an opening symbol, a binary relation, and a closing symbol +respectively:\begin{verbatim} +\def\bigl{\mathopen\big} +\def\bigm{\mathrel\big} \def\bigr{\mathclose\big} +\end{verbatim} + +The `big' macros themselves put the requested delimiter and +a null delimiter around an empty vertical box: +\begin{verbatim} +\def\big#1{{\nulldelimiterspace=0pt \mathsurround=0pt + \hbox{$\left#1\vbox to 8.5pt{}\right.$}}} +\end{verbatim} +As an approximate measure, +the \n{Big} delimiters are one and a half times as large (11.5pt) as +\n{big} delimiters; \n{bigg} ones are twice (14.5pt), and \n{Bigg} +ones are two and a half times as large (17.5pt). + +%\point Radicals +\section{Radicals} + +A radical is a compound of a left delimiter and an overlined +math expression. +\term radicals\par\cstoidx radical\par +The overlined expression is set in the +cramped version of the surrounding style +\alt +(see page~\pageref{math:styles}). + +In the plain format and the Computer Modern +math fonts there is only one radical: the square root +construct \begin{verbatim} +\def\sqrt{\radical"270370 } +\end{verbatim} +The control sequence \cs{radical} is followed by a \gr{24-bit number} +which specifies a small and a large variant of the left delimiter +as was explained above. Joining the delimiter and the rule +is done by letting the delimiter have a large depth, and a height +which is equal to the desired rule thickness. The rule can then +be placed on the current baseline. After the delimiter and the +ruled expression have been joined the whole is shifted +vertically to achieve the usual vertical centring +(see Chapter~\ref{math}). + +%\point Math accents +\section{Math accents} + +Accents in math mode are specified by +\cstoidx mathaccent\par\term accents in math mode\par +\begin{disp}\cs{mathaccent}\gr{15-bit number}\gr{math field}\end{disp} +Representing the 15-bit number as \verb>"xyzz>, +only the family~\n{y} and the character position~\n{zz} +are used: an accented expression acts as \cs{mathord} expression +(see Chapter~\ref{math}). + +In math mode whole expressions can be accented, +\alt +whereas in text mode only characters can be accented. +Thus in math mode accents can be stacked. However, the top +accent may (or, more likely, will) not be properly positioned +horizontally. Therefore the plain format has a macro \csidx{skew} +that effectively shifts the top accent. Its definition is +\begin{verbatim} +\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}} +\end{verbatim} +and it is used for instance like +\begin{verbatim} +$\skew4\hat{\hat x}$ +\end{verbatim} +\message{skew thing.} +%which gives~{\font\tmp=cmmi10 $\textfont\VMIfam=\tmp\skew4\hat{\hat x}$}. +which gives~{$\skew4\hat{\hat x}$}. + +For the correct positioning of accents over single characters +the symbol and extension font have a \csidx{skewchar}: +this is the largest accent that adds to the width of an +accented character. Positioning of any accent +is based on the width of the character to be accented, +followed by the skew character. + +The skew characters of the Computer Modern +math italic and symbol fonts are character \n{\hex7F}, +\alt +`$\mathchar"7F$',\message{skew characters} +and \n{\hex30}, `$\mathchar"30$', respectively. The \csidx{defaultskewchar} +value is assigned to the \cs{skewchar} when a font is loaded. +In plain \TeX\ this is~\n{-1}, so fonts ordinarily have no +\cs{skewchar}. + +Math accents can adapt themselves to the size of the accented +expression: \TeX\ will look for a successor of an accent +in the same way that it looks for a successor of a delimiter. +In the Computer Modern math fonts this mechanism is used in +\cstoidx widehat\par\cstoidx widetilde\par +the \cs{widehat} and \cs{widetilde} macros. +For example, +\begin{disp}\verb>\widehat x>, \verb>\widehat{xy}>, \verb>\widehat{xyz}> +\end{disp} give +\begin{disp}$\widehat x$, $\widehat{xy}$, $\widehat{xyz}$ +\end{disp} respectively. + + + + +%\subject[mathfont] Fonts in Formulas +\endofchapter +\chapter{Fonts in Formulas}\label{mathfont} + +For math typesetting a single current font is not sufficient, as it +is for text typesetting. Instead \TeX\ uses several font families, +and each family can contain three fonts. This chapter +explains how font families are organized, and how \TeX\ determines +from what families characters should be taken. + + +\begin{inventory} + +\item [\cs{fam}] + The number of the current font family. + +\item [\cs{newfam}] + Allocate a new math font family. + +\item [\cs{textfont}] + Access the textstyle font of a family.\alt + +\item [\cs{scriptfont}] + Access the scriptstyle font of a family.\alt + +\item [\cs{scriptscriptfont}] + Access the scriptscriptstyle font of a family.\alt + +\end{inventory} + +%\point Determining the font of a character in math mode +\section{Determining the font of a character in math mode} + +The characters in math formulas can be taken from several +\term font families\par +different fonts (or better, font families) without any user +commands. For instance, in plain \TeX\ math formulas use +the roman font, the math italic font, +the symbol font and the math extension font. + +In order to determine from which font a character is to be +taken, \TeX\ considers for each character in a formula its +\cs{mathcode} (this is treated in Chapter~\ref{mathchar}). +A~\cs{mathcode} is a 15-bit number of the form +\verb."xyzz., where the hex digits +have the following meaning:\begin{disp} +\n x:~class,\nl +\n y:~family,\nl +\n{zz}:~position in font.\end{disp} + +In general only the family determines from what font +a character is to be taken. +The class of a math character is mostly used to +control spacing and other aspects of typesetting. +Typical classes include `relation', `operator', `delimiter'. + +Class~7 is special in this respect: +it is called `variable family'. +If a character has a \cs{mathcode} of the form \verb."7yzz. +it is taken from family \n{y}, +unless the parameter \cs{fam} has a value in the range 0--15; +then it is taken from family~\cs{fam}. + + +%\point Initial family settings +\section{Initial family settings} + +Both lowercase and uppercase letters +are defined by \IniTeX\ to have math codes \verb>"71zz>, +\label{ini:fam}% +which means that they are of variable family, initially from +family~1. +As \TeX\ sets \verb.fam=-1., that is, +an invalid value, when a formula starts, +characters are indeed taken from +family~1, which in plain \TeX\ is math italic. + +Digits have math code \verb>"70zz> so they are initially from +family~0, in plain \TeX\ the roman font. +All other character codes have a mathcode +assigned by \IniTeX\ as +\begin{disp}\cs{mathcode}$\,x=x$\end{disp} which puts them in class~0, +ordinary, and family~0, roman in plain \TeX. + +In plain \TeX, commands such as \cs{sl} then set both a font and +a family: +\begin{verbatim} +\def\sl{\fam\slfam\tensl} +\end{verbatim} +so putting \cs{sl} in a formula will cause all letters, digits, +and uppercase Greek characters, to change to +slanted style. + +In most cases, any font can be assigned to any family, but +two families in \TeX\ have a special meaning: these are +families 2 and~3. +For instance, their number of \cs{fontdimen} parameters +is different from the usual~7. Family~2 needs 22 parameters, +and family~3 needs~13. These parameters have all a very +specialized meaning for positioning in math typesetting. +Their meaning is explained below, but for the full story +the reader is referred to appendix~G of \TeXbook. + + +%\point Family definition +\section{Family definition} + +\TeX\ can access 16 families of fonts in math mode; +font families have numbers 0--15. +The number of the +current family is recorded in the parameter~\csidx{fam}. + +The macro \csidx{newfam} gives the number of an unused family. +This number is assigned using \cs{chardef} to the control sequence. + + +Each font family can have a font meant for text style, script style, +and scriptscript style. Below it is explained how \TeX\ +determines in what style a (sub-) formula is to be typeset. + +Fonts are assigned to a family +\cstoidx textfont\par\cstoidx scriptfont\par\cstoidx scriptscriptfont\par +as follows: +\begin{verbatim} +\newfam\MyFam +\textfont\MyFam=\tfont \scriptfont\MyFam=\sfont +\scriptscriptfont\MyFam=\ssfont +\end{verbatim} +for the text, script, and scriptscript fonts of a family. +In general it is not necessary to fill all three members +of a family (but it is for family~3). +If \TeX\ needs a character from a family member +that has not been filled, +it uses the \cs{nullfont} instead, +a~primitive font that has no characters (nor a \n{.tfm} file). + + +%\point Some specific font changes +\section{Some specific font changes} + +%\spoint Change the font of ordinary characters and uppercase Greek +\subsection{Change the font of ordinary characters and uppercase Greek} + +All letters and the uppercase Greek characters are +by default in plain \TeX\ of class~7, +variable family, so changing \cs{fam} will change the font +from which they are taken. +For example +\begin{verbatim} +{\fam=9 x} +\end{verbatim} + gives an \n{x} from family~9. + +Uppercase Greek characters are defined by +\cs{mathchardef} statements in the plain format as \verb>"70zz>, +that is, variable family, initially roman. +Therefore, uppercase Greek character also change with the family. + +%\spoint Change uppercase Greek independent of text font +\subsection{Change uppercase Greek independent of text font} + +In the Computer Modern font layout, uppercase Greek letters +are part of the roman font; see page~\pageref{cmr:table}. +\alt +Therefore, introducing another +text font (with another layout) +will change the uppercase Greek characters +(or even make them disappear). +One way of remedying this is by introducing a new family in +which the \n{cmr} font, which contains the uppercase Greek, +resides. +The control sequences accessing these characters then have +to be redefined: +\begin{verbatim} +\newfam\Kgreek +\textfont\Kgreek=cmr10 ... +\def\hex#1{\ifcase#10\or 1\or 2\or 3\or 4\or 5\or 6\or + 7\or 8\or 9\or A\or B\or C\or D\or E\or F\fi} +\mathchardef\Gamma="0\hex\Kgreek00 % was: "0100 +\mathchardef\Beta ="0\hex\Kgreek01 % was: "0101 +\mathchardef\Gamma ... +\end{verbatim} +Note, by the way, +the absence of a either a space or a \cs{relax} token after +\n{\#1} in the definition of \cs{hex}. This implies that this +macro can only be called with an argument that is a +control sequence. + +%\spoint Change the font of lowercase Greek +\subsection{Change the font of lowercase Greek } + and mathematical symbols + +Lowercase Greek characters have math code +\verb>"01zz>, meaning they are always from the math italic family. +In order to change this one might redefine them, +for instance \verb.\mathchardef\alpha="710B., +to make them variable family. +This is not done in plain \TeX, because the Computer Modern +roman font does not +have Greek lowercase, although it does have the uppercase characters. + +Another way is to redefine them like \verb.\mathchardef\alpha="0n0B. +where \n{n} is the (hexadecimal) number of a family +compatible with math italic, containing for instance a bold +math italic font. + + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint New fonts in formulas +\subsection{New fonts in formulas} + +There are two ways to access a font inside mathematics. +\howto Change fonts in a math formula\par +\mdqon +After \cs{font}""\cs{newfont=....} it is not possible to get +\mdqoff +the `a' of the new font by \verb-$...{\newfont a}...$- +because \TeX\ does not look at the current font in math mode. +What does work is +\begin{verbatim} +$ ... \hbox{\newfont a} ...$ +\end{verbatim} +but this precludes the use of the new font in script and +scriptscript styles. + +The proper solution takes a bit more work: +\begin{verbatim} +\font\newtextfont=... +\font\newscriptfont=... \font\newsscriptfont=... +\newfam\newfontfam +\textfont\newfontfam=\newtextfont +\scriptfont\newfontfam=\newscriptfont +\scriptscriptfont\newfontfam=\newsscriptfont +\def\newfont{\newtextfont \fam=\newfontfam} +\end{verbatim} +after which the font can be used as +\begin{verbatim} +$... {\newfont a_{b_c}} ...$ +\end{verbatim} +in all three styles. + +%\spoint Evaluating the families +\subsection{Evaluating the families} + +\TeX\ will only look at what is actually in the \cs{textfont} +et cetera of the various families at the end of the whole +formula. Switching fonts in the families is thus not possible +inside a single formula. +The number of 16 families may therefore turn out to be restrictive +for some applications. + + +%\subject[math] Mathematics Typesetting +\endofchapter +\chapter{Mathematics Typesetting}\label{math} + +\TeX\ has two math modes, display and non-display, and +four styles, display, text, script, and scriptscript style, and +\altt +every object in math mode belongs to one of eight classes. +This chapter treats these concepts. + + + +\begin{inventory} +\item [\cs{everymath}] + Token list inserted at the start of a non-display formula. + +\item [\cs{everydisplay}] + Token list inserted at the start of a display formula. + +\item [\cs{displaystyle}] + Select the display style of mathematics typesetting. + +\item [\cs{textstyle}] + Select the text style of mathematics typesetting. + +\item [\cs{scriptstyle}] + Select the script style of mathematics typesetting. + +\item [\cs{scriptscriptstyle}] + Select the scriptscript style of mathematics typesetting. + +\item [\cs{mathchoice}] + Give four variants of a formula for the four styles + of mathematics typesetting. + +\item [\cs{mathord}] + Let the following character or subformula function + as an ordinary object. + +\item [\cs{mathop}] + Let the following character or subformula function + as a large operator. + +\item [\cs{mathbin}] + Let the following character or subformula function + as a binary operation. + +\item [\cs{mathrel}] + Let the following character or subformula function as a relation. + +\item [\cs{mathopen}] + Let the following character or subformula function + as a opening symbol. + +\item [\cs{mathclose}] + Let the following character or subformula function + as a closing symbol. + +\item [\cs{mathpunct}] + Let the following character or subformula function + as a punctuation symbol. + +\item [\cs{mathinner}] + Let the following character or subformula function + as an inner formula. + +\item [\cs{mathaccent}] + Place an accent in math mode. + +\item [\cs{vcenter}] + Construct a vertical box, vertically centred + on the math axis. + +\item [\cs{limits}] + Place limits over and under a large operator. + +\item [\cs{nolimits}] + Place limits of a large operator as subscript and + superscript expressions. + +\item [\cs{displaylimits}] + Restore default placement for limits. + +\item [\cs{scriptspace}] + Extra space after subscripts and superscripts. + Plain \TeX\ default:~\n{0.5pt} + +\item [\cs{nonscript}] + Cancel the next glue item if it occurs in + scriptstyle or scriptscriptstyle. + +\item [\cs{mkern}] + Insert a kern measured in mu units. + +\item [\cs{mskip}] + Insert glue measured in mu units. + +\item [\cs{muskip}] + Prefix for skips measured in mu units. + +\item [\cs{muskipdef}] + Define a control sequence to be a synonym for + a~\cs{muskip} register. + +\item [\cs{newmuskip}] + Allocate a new muskip register. + +\item [\cs{thinmuskip}] + Small amount of mu glue. + +\item [\cs{medmuskip}] + Medium amount of mu glue. + +\item [\cs{thickmuskip}] + Large amount of mu glue. + +\item [\cs{mathsurround}] + Kern amount placed before and after in-line formulas. + +\item [\cs{over}] + Fraction. + +\item [\cs{atop}] + Place objects over one another. + +\item [\cs{above}] + Fraction with specified bar width. + +\item [\cs{overwithdelims}] + Fraction with delimiters. + +\item [\cs{atopwithdelims}] + Place objects over one another with delimiters. + +\item [\cs{abovewithdelims}] + Generalized fraction with delimiters. + +\item [\cs{underline}] + Underline the following \gr{math symbol} or group. + +\item [\cs{overline}] + Overline the following \gr{math symbol} or group. + + +\item [\cs{relpenalty}] + Penalty for breaking after a binary relation + not enclosed in a subformula. + Plain \TeX\ default:~\n{500} + +\item [\cs{binoppenalty}] + Penalty for breaking after a binary operator not enclosed in + a subformula. + Plain \TeX\ default:~\n{700} + +\item [\cs{allowbreak}] + Macro for creating a breakpoint. + +\end{inventory} + +%\point[math:modes] Math modes +\section{Math modes} +\label{math:modes} + +\TeX\ changes to math mode when it encounters a math shift +\term math modes\par\term math shift character\par +character, category~3, in the input. After such an opening +math shift it investigates (without expansion) the next +token to see whether this is another math shift. +In the latter case \TeX\ starts processing in display math mode +until a closing double math shift is encountered: +\begin{disp}\verb> .. $$ >{\italic displayed formula}\verb> $$ ..>\end{disp} +Otherwise it starts processing an in-line formula +in non-display math mode: +\begin{disp}\verb> .. $ >{\italic in-line formula}\verb> $ ..>\end{disp} +The single math shift character is a \gr{horizontal command}. + +Exception: displays are not possible in restricted horizontal +mode, so inside an \cs{hbox} the sequence +\verb>$$> is an empty math formula and +not the start of a displayed formula. + +Associated with the two math modes are two \gr{token parameter} +registers (see also Chapter~\ref{token}): +at the start of an in-line formula the \csidx{everymath} tokens +are inserted; at the start of a displayed formula the +\cs{everydisplay} tokens are inserted. +Display math is treated further in the next chapter. + +Math modes can be tested for: \cs{ifmmode} is true +in display and non-display math mode, and \cs{ifinner} +is true in non-display mode, but not in display mode. + +%\point[math:styles] Styles in math mode +\section{Styles in math mode} +\label{math:styles} + +Math formulas are set in any of eight styles: +\term math styles\par +\begin{description} \item [D] +display style, \item [T] +text style, \item [S] +script style, \item [SS] +scriptscript style, +\end{description} +and the four `cramped' variants $D'$, $T'$, $S'$, $SS'$ of +\term cramped styles\par +these. The cramped styles differ mainly in the +fact that superscripts are not raised as far as in +the original styles. + +%\spoint Superscripts and subscripts +\subsection{Superscripts and subscripts} + +\TeX\ can typeset a symbol or group +\term superscript\par\term subscript\par +as a superscript (or subscript) to the preceding +symbol or group, if that preceding item +does not already have a superscript +(subscript). Superscripts (subscripts) are specified by +the syntax +\begin{disp}\gr{superscript}\gr{math field}\end{disp} +or +\begin{disp}\gr{subscript}\gr{math field}\end{disp} +where a \gr{superscript} (\gr{subscript}) is either a character +of category~7 (8), or a control sequence \cs{let} to such +a character. +The plain format has the control +\cstoidx\char94\par\cstoidx\char95\par +sequences +\begin{verbatim} +\let\sp=^ \let\sb=_ +\end{verbatim} +as implicit superscript +and subscript characters. + +Specifying a superscript (subscript) expression as the first +item in an empty math list is equivalent to specifying +it as the superscript (subscript) of an empty expression. +For instance, \begin{disp} +\verb>$^{...}>\quad is equivalent to\quad \verb>${}^{...}>\end{disp} + +For \TeX's internal calculations, superscript and subscript +expressions are made wider by \csidx{scriptspace}; +the value of this in plain \TeX\ is~\n{0.5pt}. + +%\spoint Choice of styles +\subsection{Choice of styles} + +Ordering the four styles $D$, $T$, $S$, and~$SS$, and +considering the other four as mere variants, the +style rules for math mode are as follows: +\begin{itemize}\item In any style superscripts and subscripts +are taken from the next smaller style. Exception: +in display style they are taken in script style. +\item Subscripts are always in the cramped variant of +the style; superscripts are only cramped if the original +style was cramped. +\item In an \verb-{..\over..}- formula in any style +the numerator and denominator are taken from the next +smaller style. +\item The denominator is always in cramped style; +the numerator is only in cramped style if the original +style was cramped. +\item Formulas under a \cs{sqrt} or \cs{overline} +are in cramped style.\end{itemize} + +Styles can be forced by the explicit commands +\alt +\cstoidx displaystyle\par\cstoidx textstyle\par +\cstoidx scriptstyle\par\cstoidx scriptscriptstyle\par +\cs{displaystyle}, \cs{textstyle}, \cs{scriptstyle}, +and~\cs{scriptscriptstyle}. + + +In display style and text style the \cs{textfont} of the +current family is used, +in scriptstyle the \cs{scriptfont} is used, and in +\alt +scriptscriptstyle the \cs{scriptscriptfont} is used. + +The primitive command +\cstoidx mathchoice\par +\begin{disp}\cs{mathchoice}\lb {\it D\/\rb\lb T\/\rb\lb S\/\rb\lb SS\/}\rb +\end{disp} +lets the user specify four variants of a formula for the +four styles. +\TeX\ constructs all four and inserts the appropriate one. + +%\point[math:class] Classes of mathematical objects +\section{Classes of mathematical objects} +\label{math:class} + +Objects in math mode belong to one of eight classes. Depending +\term math classes\par +on the class the object may be surrounded by +some amount of white space, +or treated specially in some way. Commands exist to force +symbols, or sequences of symbols, to act as +belonging to a certain class. +In the hexadecimal representation \verb>"xyzz> +the class is the \gr{3-bit number}~\n x. + +This is the list of classes and commands that force those +classes. The examples are from the plain format +(see the tables starting at page~\pageref{math:sym:tables}). +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=-1 +\item {\em ordinary\/}: lowercase Greek characters and those symbols + that are `just symbols'; + the command \csidx{mathord} forces this class. +\item {\em large operator\/}: integral and sum signs, + and `big' objects such as \cs{bigcap} or \cs{bigotimes}; + the command \csidx{mathop} forces this class. + Characters that are + large operators are centred vertically, and they + may behave differently in display style from in the + other styles; see below. +\item {\em binary operation\/}: plus and minus, + and things such as \cs{cap} or \cs{otimes}; + the command \csidx{mathbin} forces this class. +\item {\em relation\/} (also called {\em binary relation\/}): + equals, less than, and greater than signs, subset and + superset, perpendicular, parallel; + the command \csidx{mathrel} forces this class. +\item {\em opening symbol\/}: opening brace, bracket, parenthesis, angle, + \altt + floor, ceiling; + the command \csidx{mathopen} forces this class. +\item {\em closing symbol\/}: closing brace, bracket, parenthesis, angle, + \altt + floor, ceiling; + the command \csidx{mathclose} forces this class. +\item {\em punctuation\/}: most punctuation marks, but + \n:~is a relation, the \cs{colon} is a punctuation colon; + the command \csidx{mathpunct} forces this class. +\item {\em variable family\/}: symbols in this class change font + with the \cs{fam} parameter; in plain \TeX\ uppercase + Greek letters and ordinary letters and digits are + in this class. +\end{enumerate} + +There is one further class: the {\em inner\/} subformulas. +No characters can be assigned to this class, but characters and +subformulas can be forced into it by \csidx{mathinner}. +The \gr{generalized fraction}s and \verb-\left...\right- groups +are inner formulas. Inner formulas are surrounded +by some white space; see the table below. + +Other subformulas than those that are inner are treated as +ordinary symbols. In particular, subformulas enclosed in +braces are ordinary: \verb-$a+b$- looks like `$a\mathop+b$', but +\message{Check a+b look}% +\verb-$a{+}b$- looks like~`$a{+}b$'. Note, however, that +in \verb-${a+b}$- the whole subformula is treated as an +ordinary symbol, not its components; +therefore the result is~`${a+b}$'. + +%\point Large operators and their limits +\section{Large operators and their limits} + +The large operators in the Computer Modern fonts come in +two sizes: one for text style and one for display style. +Control sequences such as \cs{sum} are simply defined by +\cs{mathchardef} to correspond to a position in a font: +\begin{verbatim} +\mathchardef\sum="1350 +\end{verbatim} +but if the +current style is display style, \TeX\ looks to see whether +that character has a successor in the font. + +Large operators in text style behave as if they are followed +\cstoidx limits\par\cstoidx nolimits\par +by \cs{nolimits}, which places the limits as sub/superscript +expressions after the +operator:\begin{disp}$\sum_{k=1}^\infty$\end{disp} +In display style they behave as if they are followed by +\cs{limits}, which places the limits over and under +the operator:\begin{disp}$\displaystyle\sum_{k=1}^\infty$\end{disp} +The successor mechanism (see page~\pageref{successor}) +\alt +lets \TeX\ take a larger variant +of the delimiter here. + +The integral sign has been defined in plain \TeX\ as +\begin{verbatim} +\mathchardef\intop="1352 \def\int{\intop\nolimits} +\end{verbatim} +which places the limits after the operator, even in display style: +\begin{disp}$\displaystyle\int_0^\infty e^{-x^2}\,dx=\sqrt{\pi}/2$ +\end{disp} + +With \verb-\limits\nolimits- or \verb-\nolimits\limits- the +last specification has precedence; the default placement +can be restored by \csidx{displaylimits}. For instance, +\begin{verbatim} +$ ... \sum\limits\displaylimits ... $ +\end{verbatim} +is equivalent to \begin{verbatim} +$ ... \sum ... $ +\end{verbatim} +and +\begin{verbatim} +$$ ... \sum\nolimits\displaylimits ... $$ +\end{verbatim} +is equivalent to +\begin{verbatim} +$$ ... \sum ... $$ +\end{verbatim} + +%\point Vertical centring: \cs{vcenter} +\section{Vertical centring: \protect\cs{vcenter}} + +Each formula has an {\em axis\/}, which is for an in-line +\term axis of math formulas\par\term centring of math formulas\par +formula about half the x-height of the surrounding +text; the exact value is the \cs{fontdimen22} of the +font in family~2, the symbol font, in the current style. + +The bar line in fractions is placed on the axis; large +operators, delimiters and \cs{vcenter} boxes are centred on it. + +A \csidx{vcenter}\label{vcenter} +box is a vertical box that is arranged +so that it is centred on the math axis. +It is possible to give a \n{spread} or \n{to} +specification with a \cs{vcenter} box. + +The \cs{vcenter} box is allowed only in math mode, and +it does not behave like other boxes; for instance, it can +not be stored in a box register. It does not qualify as +a~\gr{box}. See page~\pageref{tvcenter} for a macro that +repairs this. + +%\point[muglue] Mathematical spacing: \n{mu} glue +\section{Mathematical spacing: \n{mu} glue} +\label{muglue} + +Spacing around mathematical objects is measured in \n{mu} +\term math spacing\par\term math unit\par\term mu glue\par +units. A~\n{mu} is $1/18$th part of \cs{fontdimen6} +of the font in family~2 in the current style, +the `quad' value of the symbol font. + +%\spoint Classification of \n{mu} glue +\subsection{Classification of \n{mu} glue} + +The user can specify \n{mu} spacing by \cs{mkern} or~\cs{mskip}, +\cstoidx mkern\par\cstoidx mskip\par +but most \n{mu} glue is inserted automatically by \TeX, +based on the classes to which objects belong (see above). +First, here are some rules of thumb describing the global +behaviour. + +\begin{itemize} \item A \cs{thickmuskip} (default value in plain +\TeX: \n{5mu plus 5mu}) +\cstoidx thickmuskip\par +is inserted around (binary) relations, except where these are +preceded or followed by other relations or punctuation, and +except if they follow an open, or precede a close symbol. +\item A \csidx{medmuskip} (default value in plain +\TeX: \n{4mu plus 2mu minus 4mu}) +is put around binary operators. +\item A \csidx{thinmuskip} +(default value in plain \TeX: \n{3mu}) follows after +punctuation, and is put around inner objects, except where these +are followed by a close or preceded by an open symbol, and +except if the other object is a large operator or a +binary relation. +\item No \n{mu} glue is inserted after an open or before a close +symbol except where the latter is preceded by punctuation; +no \n{mu} glue is inserted also before punctuation, except where +the preceding object is punctuation or an inner object. +\end{itemize} + +The following table gives the complete definition of mu glue +between math objects. +\begin{disp}\leavevmode +\vbox{\offinterlineskip + \halign{#\enspace\hfil&#\enspace\hfil\vrule + &&\hfil\enspace#\hfil\strut\cr + \omit\hfil&\omit\hfil& 0:& 1:& 2:& 3:& 4:& 5:& 6:\cr + \omit\hfil&\omit\hfil&\hfill Ord&\hfill Op&\hfill Bin&\hfill Rel& + \hfill Open&\hfill Close&\hfill Punct&\hfill Inner\cr + \omit\hfil&\omit\hfil&\multispan8\hrulefill\cr + 0:&Ord& 0& 1&(2)&(3)& 0& 0& 0&(1)\cr + 1:&Op& 1& 1& *&(3)& 0& 0& 0&(1)\cr + 2:&Bin& (2)&(2)& *& *&(2)& *& *&(2)\cr + 3:&Rel& (3)&(3)& *& 0&(2)& *& *&(2)\cr + 4:&Open& 0& 0& *& 0& 0& 0& 0& 0\cr + 5:&Close& 0& 1&(2)&(3)& 0& 0& 0&(1)\cr + 6:&Punct&(1)&(1)& *&(1)&(1)&(1)&(1)&(1)\cr + &Inner&(1)& 1&(2)&(3)&(1)& 0&(1)&(1)\cr +% \omit\hfil&\omit\hfil&\multispan8\hrulefil\cr +}} +\end{disp} + +where the symbols have the following meanings: +\begin{itemize}\item 0, no space; 1, thin space; 2, medium space; + 3, thick space; +\item $(\cdot)$, insert only in text and display + mode, not in script or scriptscript mode; +\item cases * cannot occur, because a Bin object is converted + to Ord if it is the first in the list, preceded by + Bin, Op, Open, Punct, Rel, or followed by Close, + Punct, and Rel; also, a Rel is converted to Ord when + \alt + it is followed by Close or Punct. +\end{itemize} + +Stretchable \n{mu} glue is set according to the same rules that +govern ordinary glue. However, only \n{mu} glue on the outer +level can be stretched or shrunk; any \n{mu} glue enclosed +in a~group is set at natural width. + +%\spoint Muskip registers +\subsection{Muskip registers} + +Like ordinary glue, \n{mu} glue can be stored in registers, +\cstoidx muskip\par\cstoidx muskipdef\par\cstoidx newmuskip\par +the \cs{muskip} registers, +of which there are 256 in \TeX. +The registers are denoted by +\begin{disp}\cs{muskip}\gr{8-bit number}\end{disp} +and they can be assigned to a control sequence by +\begin{disp}\cs{muskipdef}\gr{control sequence}\gr{equals}\gr{8-bit number} +\end{disp} +and there is a macro that allocates unused registers: +\begin{disp}\cs{newmuskip}\gr{control sequence}\end{disp} +Arithmetic for mu glue exists as for glue; see +Chapter~\ref{glue}. + +%\spoint Other spaces in math mode +\subsection{Other spaces in math mode} + +In math mode space tokens are ignored; however, +the math code of the space character is \verb-"8000- +in plain \TeX, +so if its category is made `letter' or `other character', it +will behave like an active character in math mode. +See also page~\pageref{mcode:8000}. + +Admissible glue in math mode is of type~\gr{mathematical skip}, +which is either a \gr{horizontal skip} (see Chapter~\ref{hvmode}) +or~\cs{mskip}\gr{muglue}. Leaders in math mode can be specified +with a \gr{mathematical skip}. + +A glue item preceded by \csidx{nonscript} +is cancelled if it occurs in scriptstyle or scriptscriptstyle. + +Control space functions in math mode +\alt +as it does in horizontal mode. + +In-line formulas are surrounded by kerns of size +\csidx{mathsurround}, the so-called `math-on' and +`math-off' items. Line breaking can occur at the front of +the math-off kern if it is followed by glue. + +%\point Generalized fractions +\section{Generalized fractions} + +Fraction-like objects can be set with six primitive commands +of type \gr{generalized fraction}. +\term generalized fractions\par +Each of these takes the preceding and the following subformulas +and puts them over one another, if necessary with a fraction +bar and with delimiters. +\begin{description} \item [\csidx{over}] + is the ordinary fraction; the bar thickness is \cs{fontdimen8} + of the extension font: + \begin{disp}\verb>$\pi\over2$>\quad gives\quad `$\pi\over2$'\message{pi over 2}\end{disp} +\item [\csidx{atop}] + is equivalent to a fraction with zero bar thickness: + \begin{disp}\verb>$\pi\atop2$>\quad gives\quad `$\pi\atop2$'\end{disp} +\item [\csidx{above}\gr{dimen}] + specifies the thickness + of the bar line explicitly: + \begin{disp}\verb>$\pi\above 1pt 2$>\quad gives\quad `$\pi\above 1pt 2$'\end{disp} +\end{description} + +To each of these three there corresponds a \cs{...withdelims} variant +\cstoidx overwithdelims\par\cstoidx atopwithdelims\par +\cstoidx abovewithdelims\par +that lets the user specify delimiters for the expression. +For example, the most general command, in terms of which +all five others could have been defined, is +\begin{disp}\cs{abovewithdelims}\gr{delim$_1$}\gr{delim$_2$}\gr{dimen}. +\end{disp} +Delimiters in these generalized fractions do not grow with the +enclosed expression: in display mode a delimiter is taken +which is at least \cs{fontdimen20} high, otherwise +\alt +it has to be +at least \cs{fontdimen21} high. +These dimensions are taken +from the font in family~2, the symbol font, in the current style. + +The control sequences \cs{over}, \cs{atop}, and \cs{above} +are primitives, although they could have been defined +as \cs{...withdelims..}, that is, with two null delimiters. +Because of these implied surrounding null delimiters, +there is a kern of size \cs{nulldelimiterspace} before and after +these simple generalized fractions. + +%\point Underlining, overlining +\section{Underlining, overlining} + +The primitive commands \csidx{underline} and \csidx{overline} take a +\gr{math field} argument, that is, a \gr{math symbol} or +a group, and draw a line under or over it. +The result is an `Under' or `Over' atom, which +is appended to the current math list. +The line thickness is font dimension~8 of the extension font, +which also determines the clearance between the line and +the \gr{math field}. + +Various other \cs{over...} and \cs{under...} commands exist +in plain \TeX; +these are all macros +that use the \TeX\ \cs{halign} command. + +%\point Line breaking in math formulas +\section{Line breaking in math formulas} + +In-line formulas can be broken after relations and binary operators. +\cstoidx relpenalty\par\cstoidx binoppenaly\par +\term penalties in math mode\par +The respective penalties are the \cs{relpenalty} +and the~\cs{binoppenalty}. However, \TeX\ will only break +after such symbols if they are not enclosed in braces. +Other breakpoints can be created with~\cs{allowbreak}, +\cstoidx allowbreak\par\term breakpoints in math lists\par +which is an abbreviation for~\cs{penalty0}. + +Unlike in horizontal or vertical mode where putting two penalties +in a row is equivalent to just placing the smallest one, +in math mode a penalty placed at a break point \ldash that is, +after a relation or binary operator \rdash will effectively +replace the old penalty by the new one. + +%\point[fam23:fontdims] Font dimensions of families 2 and 3 +\section{Font dimensions of families 2 and 3} +\label{fam23:fontdims} + +If a font is used in text mode, \TeX\ will look at its +first 7 \cs{fontdimen} parameters +(see page~\pageref{font:dims}), for instance to +control spacing. +In math, however, more font dimensions are needed. +\TeX\ will look at the first 22 parameters of the +fonts in family~2, and the first 13 of the fonts in +family~3, to control various +aspects of math typesetting. The next two subsections +have been quoted loosely from~\cite{BB:ISO}. + +%\spoint Symbol font attributes +\subsection{Symbol font attributes} + +Attributes of the font in family 2 mainly specify the +\term symbol font\par +initial vertical positioning +of parts of fractions, subscripts, superscripts, et cetera. +The position determined by applying these +attributes may be further modified because of other +conditions, for example the presence of a fraction bar. + +One text font dimension, number~6, +the quad, determines the size of mu glue; +see above. + +Fraction numerator attributes: minimum shift up, from +the main baseline, of the baseline of the numerator +of a generalized fraction, +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=7 +\item num1: + for display style, +\item num2: + for text style or smaller if a fraction bar is present, +\item num3: + for text style or smaller if no fraction bar is present. +\end{enumerate} + +Fraction denominator attributes: minimum shift down, from +the main baseline, of the baseline of the denominator +of a generalized fraction, +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=10 +\item denom1: +for display style, +\item denom2: +for text style or smaller. +\end{enumerate} + +Superscript attributes: minimum shift up, from the main baseline, +of the baseline of a superscript, +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=12 +\item sup1: +for display style, +\item sup2: +for text style or smaller, non-cramped, +\item sup3: +for text style or smaller, cramped. +\end{enumerate} + +Subscript attributes: minimum shift down, from the main baseline, +of the baseline of a subscript, +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=15 +\item sub1: +when no superscript is present, +\item sub2: +when a superscript is present. +\end{enumerate} + +Script adjustment attributes: for use only with non-glyph, +that is, composite, objects. +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=17 +\item sup\_drop: +maximum distance of superscript baseline below top of nucleus +\item sub\_drop: +minimum distance of subscript baseline below bottom of nucleus. +\end{enumerate} + +Delimiter span attributes: height plus depth of delimiter enclosing +a generalized fraction, +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=19 +\item delim1: +in display style, +\item delim2: +in text style or smaller. +\end{enumerate} + +A parameter with many uses, the height of the math axis, +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=21 +\item axis\_height: +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 centring operations. +\end{enumerate} + +%\spoint Extension font attributes +\subsection{Extension font attributes} + +Attributes of the font in family 3 mostly specify +the way the limits of large operators are set. + +The first parameter, number 8, default\_rule\_thickness, +serves many purposes. It +is the thickness of the rule used for overlines, +underlines, radical extenders (square root), +and fraction bars. Various clearances are also specified +in terms of this dimension: between the fraction bar and +the numerator and denominator, between an object and +the rule drawn by an underline, overline, or radical, +and between the bottom of superscripts and top of subscripts. + +Minimum clearances around large operators are as follows: +\begin{enumerate} \message{set a counter here!}%\SetCounter:item=8 +\item big\_op\_spacing1: +minimum clearance between baseline of upper limit and top +of large operator; see below. +\item big\_op\_spacing2: +minimum clearance between bottom of large operator and top of +lower limit. +\item big\_op\_spacing3: +minimum clearance between baseline of +upper limit and top of large operator, +taking into account depth of upper limit; see below. +\item big\_op\_spacing4: +minimum clearance between bottom of large operator and top of lower +limit, taking into account height of lower limit; see below. +\item big\_op\_spacing5: +clearance above upper limit or below lower limit of a large operator. +\end{enumerate} +The resulting clearance above an operator is the maximum +of parameter~7, and parameter~11 minus the depth of the +upper limit. +The resulting clearance below an operator is the maximum +of parameter~10, and parameter~12 minus the height of the +lower limit. + +%\spoint Example: subscript lowering +\subsection{Example: subscript lowering} + +The location of a subscript depends on whether there +\alt +\howto Adjust subscript lowering\par +is a superscript; for instance +\begin{disp} $X_1+Y^2_1=1$\end{disp} +If you would rather have that look like +\begin{disp} $\global\tempdima=\fontdimen16\textfont2\relax + \global\tempdimb=\fontdimen17\textfont2\relax + \fontdimen16\textfont2=3pt \fontdimen17\textfont2=3pt + X_1+Y^2_1=1$,$\fontdimen16\textfont2=\tempdima\relax + \fontdimen17\textfont2=\tempdimb\relax$ +\end{disp} +\message{check lowering} +it suffices to specify +\begin{verbatim} +\fontdimen16\textfont2=3pt \fontdimen17\textfont2=3pt +\end{verbatim} +which makes the subscript drop equal in both cases. + +%\subject[displaymath] Display Math +\endofchapter +\chapter{Display Math}\label{displaymath} + +Displayed formulas are set on a line of their own, usually +somewhere in a paragraph. This chapter explains +how surrounding white space (both above/below and to the +left/right) is calculated. + + +\begin{inventory} +\item [\cs{abovedisplayskip \cs{belowdisplayskip}}] +\mdqon + Glue above/""below a display. +\mdqoff + Plain \TeX\ default:~\n{12pt plus 3pt minus 9pt} + +\item [\cs{abovedisplayshortskip \cs{belowdisplayshortskip}}] +\mdqon + Glue above/""below a display if the line preceding the display +\mdqoff + was short. + Plain \TeX\ defaults:~\n{0pt plus 3pt} and + \n{7pt plus 3pt minus 4pt} respectively. + +\item [\cs{predisplaypenalty \cs{postdisplaypenalty}}] +\mdqon + Penalty placed in the vertical list above/""below a display. +\mdqoff + Plain \TeX\ defaults:~\n{10$\,$000} and~\n{0} + respectively. + +\item [\cs{displayindent}] + Distance by which the box, in which the display + is centred, is indented owing to hanging indentation. + +\item [\cs{displaywidth}] + Width of the box in which the display is centred. + +\item [\cs{predisplaysize}] + Effective width of the line preceding the display. + +\item [\cs{everydisplay}] + Token list inserted at the start of a display. + +\item [\cs{eqno}] + Place a right equation number in a display formula. + +\item [\cs{leqno}] + Place a left equation number in a display formula. + +\end{inventory} + +%\point Displays +\section{Displays} + +\TeX\ starts building a display when it encounters two +\term displays\par +math shift characters (characters of category~3, +\verb>$>~in plain \TeX) in a row. +Another such pair (possibly followed +\alt by one optional space) indicates the end of the display. + +Math shift is a \gr{horizontal command}, but displays are only +allowed in unrestricted horizontal mode +(\verb>$$>~is an empty math formula in restricted horizontal mode). +Displays themselves, however, are started in the +surrounding (possibly internal) vertical mode in order to calculate +quantities such as~\cs{prevgraf}; the result of the display is +appended to the vertical list. + +The part of the paragraph above the display is broken into +lines as an independent paragraph (but \cs{prevgraf} is +carried over; see below), and the remainder of the +paragraph is set, starting with an empty list and \cs{spacefactor} +equal to~1000. +The \cs{everypar} tokens are not inserted for the part of the +paragraph after the display, nor is \cs{parskip} glue inserted. + +Right at the beginning of the display the \csidx{everydisplay} +token list is inserted (but after the calculation of +\cs{displayindent}, \cs{displaywidth}, and \cs{predisplaysize}). +See page~\pageref{left:display} for an example of the use +of \cs{everydisplay}. + +The page builder is exercised +before the display +(but after the \cs{everydisplay} tokens have been inserted), +and after the display finishes. + +The `display style' of math typesetting was treated in +Chapter~\ref{mathfont}. + +%\point Displays in paragraphs +\section{Displays in paragraphs} + +Positioning of a display in a paragraph may be influenced +by hanging indentation or a \cs{parshape} specification. +For this, \TeX\ uses the \cs{prevgraf} parameter +(see Chapter~\ref{par:shape}), and +acts as if the display is three lines deep. + +If $n$ is the value of \cs{prevgraf} when the display starts +\ldash so there are $n$ lines of text above the display \rdash +\cs{prevgraf} is set to to $n+3$ when the paragraph resumes. +The display occupies, as it were, lines $n+1$, $n+2$, and~$n+3$. +The shift and line width for the display are those +that would hold for line~$n+2$. + +The shift for the display is recorded in \cs{displayindent}; +\cstoidx displayindent\par\cstoidx displaywidth\par +the line width is recorded in \cs{displaywidth}. These parameters +(and the \cs{predisplaysize} explained below) +are set immediately after the \verb>$$> has been scanned. +Usually they are equal to zero and \cs{hsize} respectively. +The user can change the values of these parameters; +\TeX\ will use the +values that hold after the math list +of the display has been processed. + +Note that a display is vertical material, and therefore +not influenced by settings of \cs{leftskip} and \cs{rightskip}. + +%\point Vertical material around displays +\section{Vertical material around displays} + +A display is preceded in the vertical list by +\begin{itemize}\item a penalty of size \cs{predisplaypenalty} + \cstoidx predisplaypenalty\par\cstoidx abovedisplayskip\par + \cstoidx abovedisplayshortskip\par +(plain \TeX\ default~$10\,000$), and +\item glue of size \cs{abovedisplayskip} +or \cs{abovedisplayshortskip}; this glue is omitted in +cases where a~\cs{leqno} equation number is set on +a line of its own (see below).\end{itemize} +A display is followed by +\begin{itemize}\item a penalty of size \cs{postdisplaypenalty} + \cstoidx postdisplaypenalty\par\cstoidx belowdisplayskip\par + \cstoidx belowdisplayshortskip\par +(default~0), and possibly +\item glue of size \cs{belowdisplayskip} or +\cs{belowdisplayshortskip}; this glue is omitted in cases +where an~\cs{eqno} equation number is set on a line of +its own (see below).\end{itemize} + +The `short' variants of the glue are taken if +there is no \cs{leqno} left equation number, and if +the last line of the paragraph above the display is +short enough for the display to be raised a bit without +coming too close to that line. +In order to decide this, the effective width of the +preceding line is saved in \csidx{predisplaysize}. +This value is calculated immediately after the opening \verb>$$> +of the display has +been scanned, together with the \cs{displaywidth} +and \cs{displayindent} explained above. + +Remembering that the part of the paragraph above the display +has already been broken into lines, the following method +for finding the effective width of the last line ensues. +\TeX\ takes the last box of the list, which is a horizontal +box containing the last line, and locates the right edge +of the last box in it. The \cs{predisplaysize} is then +the place of that rightmost edge, plus any amount by which +the last line was shifted, plus two ems in the current font. + +There are two exceptions to this. The \cs{predisplaysize} +is taken to be $-$\cs{maxdimen} if there was no previous line, +that is, +the display started the paragraph, or it followed another display; +\cs{predisplaysize} is taken to be \cs{maxdimen} +\term machine dependence\par +if the glue in the last line was not set at its natural width, +which may happen if the \cs{parfillskip} contained only finite +stretch. The reason for the last clause is that glue +\mdqon +setting is slightly machine"-dependent, and such dependences +\mdqoff +should be kept out of \TeX's global decision processes. + +%\point Glue setting of the display math list +\section{Glue setting of the display math list} + +The display has to fit in \cs{displaywidth}, +but in addition to the formula there +may be an equation number. The minimum separation +between the formula and the equation number should +be one em in the symbol font, that is, +\mdqon +\cs{font\-dimen\-6}""\cs{textfont2}. +\mdqoff + +If the formula plus any equation number +and separation fit into \cs{displaywidth}, +the glue in the formula is set at its natural width. +If it does not fit, +but the formula contains enough shrink, it is shrunk. +Otherwise \TeX\ puts any equation number +on a line of its own, and the glue in the formula is +set to fit it in \cs{displaywidth}. +With the equation +number on a separate line the formula may now very well fit in the +display width; however, +if it was a very long formula the box in which it is +set may still be overfull. \TeX\ nevers breaks a displayed +formula. + +%\point Centring the display formula: displacement +\section{Centring the display formula: displacement} + +Based on the width of the box containing the formula \ldash which +may not really `contain' it; it may be overfull \rdash +\TeX\ tries to centre the formula in the \cs{displaywidth}, +that is, without taking the equation number into account. +Initially, a displacement is calculated that is +half the difference between \cs{displaywidth} and the +width of the formula box. + +However, if there is an equation number that will not +be put on a separate line and the displacement is less than +twice the width of the equation number, a new displacement +is calculated. This new displacement is zero if the formula +started with glue; otherwise it is such that the +formula box is centred in the space left by the equation +number. + +If there was no equation number, or if the equation number +will be put on a separate line, the formula box +is now placed, shifted right by \cs{displayindent} plus +the displacement calculated above. + +%\point Equation numbers +\section{Equation numbers} + +The user can specify a equation number for a display +by ending it with +\cstoidx eqno\par\cstoidx leqno\par\term equation numbering\par +\begin{Disp}\cs{eqno}\gr{math mode material}\verb>$$>\end{Disp} +for an equation number placed on the right, or +\begin{Disp}\cs{leqno}\gr{math mode material}\verb>$$>\end{Disp} +for an equation number placed on the left. + +%\spoint Ordinary equation numbers +\subsection{Ordinary equation numbers} + +Above it was described how \TeX\ calculates a displacement +from the display formula and the equation number, if this +is to be put on the same line as the formula. + +If the equation number was a \cs{leqno} number, +\TeX\ places a box containing +\begin{itemize}\item the equation number, +\item a kern with the size of the displacement calculated, and +\item the formula.\end{itemize} +This box is shifted right by \cs{displayindent}. + +If the equation number was an \cs{eqno} number, +\TeX\ places a box containing +\begin{itemize}\item the formula, +\item a kern with the size of the displacement calculated, and +\item the equation number.\end{itemize} +This box is shifted right by \cs{displayindent} plus +the displacement calculated. + +%\spoint The equation number on a separate line +\subsection{The equation number on a separate line} + +Since displayed formulas may become rather big, \TeX\ can decide +(as was described above) +that any equation number should be placed on a line of its own. +A~left-placed equation number is then to be placed above the +display, in a box that is shifted right by \cs{displayindent}; +a right-placed equation number will be placed below the display, +in a box that is shifted to the right +by \cs{displayindent} plus \cs{displaywidth} minus the width of +the equation number box. + +In both cases a penalty of $10\,000$ is placed between the equation +number box and the formula. + +\TeX\ does not put extra glue above a left-placed +equation number or below +a right-placed equation number; \TeX\ here relies on +the baselineskip mechanism. + + +%\point[left:display] Non-centred displays +\section{Non-centred displays} +\label{left:display} + +As a default, \TeX\ will centre displays. +\term displays, non-centred\par +In order to get non-centred displays some +macro trickery is needed. + +One approach would +be to write a macro \cs{DisplayEquation} +that would basically look like +\begin{verbatim} +\def\DisplayEquation#1{% + \par \vskip\abovedisplayskip + \hbox{\kern\parindent$\displaystyle#1$} + \vskip\belowdisplayskip \noindent} +\end{verbatim} +but it would be nicer if one could just write +\begin{verbatim} +$$ ... \eqno ... $$ +\end{verbatim} +\mdqon +and having this come out as a left"-aligning display. +\mdqoff + +Using the \cs{everydisplay} token list, the above +idea can be realized. The basic idea is to write +\begin{verbatim} +\everydisplay{\IndentedDisplay} +\def\IndentedDisplay#1$${ ... +\end{verbatim} +so that the macro \cs{IndentedDisplay} +will receive the formula, including any equation number. +The first step is now to extract an equation number +if it is present. This makes creative use of delimited +macro parameters.\begin{verbatim} +\def\ExtractEqNo#1\eqno#2\eqno#3\relax + {\def\Equation{#1}\def\EqNo{#2}} +\def\IndentedDisplay#1$${% + \ExtractEqNo#1\eqno\eqno\relax +\end{verbatim} +Next the equation should be set in the available +space \cs{displaywidth}: +\begin{verbatim} + \hbox to \displaywidth + {\kern\parindent + $\displaystyle\Equation$\hfil$\EqNo$}$$ + } +\end{verbatim} +Note that the macro ends in the closing \verb>$$> +to balance the opening dollars that caused +insertion of the \cs{everydisplay} tokens. +This also means that the box containing the +displayed material will automatically be +surrounded by \cs{abovedisplayskip} and +\cs{belowdisplayskip} glue. +There is no need to use \cs{displayindent} anywhere +in this macro, because \TeX\ itself will shift the +display appropriately. + +% \begin{comment} +% \endinput +% baselineskip around displays? + + + +% \end{comment} +%%%% end of input file [math] + +%\InputFile:align +%%%% this is input file [align] +%\subject[align] Alignment +\endofchapter +\chapter{Alignment}\label{align} + +\TeX\ provides a general alignment mechanism for making tables. +\term alignments\par\term tables\par + +\begin{inventory} +\item [\cs{halign}] + Horizontal alignment. + +\item [\cs{valign}] + Vertical alignment. + +\item [\cs{omit}] + Omit the template for one alignment entry. + +\item [\cs{span}] + Join two adjacent alignment entries. + +\item [\cs{multispan}] + Macro to join a number of adjacent alignment entries. + +\item [\cs{tabskip}] + Amount of glue in between columns (rows) + of an \cs{halign} (\cs{valign}). + +\item [\cs{noalign}] + Specify vertical (horizontal) + material to be placed in between rows (columns) of + an \cs{halign} (\cs{valign}). + +\item [\cs{cr}] + Terminate an alignment line. + +\item [\cs{crcr}] + Terminate an alignment line if it has + not already been terminated by~\cs{cr}. + +\item [\cs{everycr}] + Token list inserted after every \cs{cr} or non-redundant + \cs{crcr}. + +\item [\cs{centering}] + Glue register in plain \TeX\ for centring + \cs{eqalign} and \cs{eqalignno}. + Value: \n{0pt plus 1000pt minus 1000pt} + +\item [\cs{hideskip}] + Glue register in plain \TeX\ to make alignment entries invisible. + Value: \n{-1000pt plus 1fill} + +\item [\cs{hidewidth}] + Macro to make preceding or following entry invisible. + +\end{inventory} + +%\point Introduction +\section{Introduction} + +\TeX\ has a sophisticated alignment mechanism, based on +templates, with one template entry per column or row. +The templates may contain any common elements +of the table entries, and in general they contain +instructions for typesetting the entries. +\TeX\ first calculates widths (for \cs{halign}) or heights +(for \cs{valign}) of all entries; +then it typesets the whole alignment using in each column (row) +the maximum width (height) of entries in that column (row). + +%\point Horizontal and vertical alignment +\section{Horizontal and vertical alignment} + +The two alignment commands in \TeX\ are +\cstoidx halign\par\cstoidx valign\par +\begin{disp}\cs{halign}\gr{box specification}\lb\gr{alignment material}\rb +\end{disp} for horizontal alignment of columns, and +\begin{disp}\cs{valign}\gr{box specification}\lb\gr{alignment material}\rb +\end{disp} for vertical alignment of rows. +\cs{halign} is a \gr{vertical command}, and +\cs{valign} is a \gr{horizontal command}. + +The braces induce a new level of grouping; they can be +implicit. + +The discussion below will mostly focus on horizontal +alignments, but, replacing `column' by `row' and vice versa, +it applies to vertical alignments too. + +%\spoint Horizontal alignments: \cs{halign} +\subsection{Horizontal alignments: \cs{halign}} + +Horizontal alignments yield a list of horizontal boxes, the rows, +\term horizontal alignment\par +which are placed on the surrounding vertical list. +The page builder is exercised after the alignment rows have been +added to the vertical list. +The value of \cs{prevdepth} that holds before the alignment +is used for the baselineskip of the first row, +and after the alignment \cs{prevdepth} is set to a value based +on the last row. + +Each entry is processed in a group of its own, +in restricted horizontal mode. + +A special type of horizontal alignment exists: the +\term display alignment\par +display alignments, specified as +\begin{disp}\n{\$\$}\gr{assignments}\cs{halign}\gr{box specification}\lb\n{...}\rb + \gr{assignments}\n{\$\$}\end{disp} +Such an alignment is shifted by \cs{displayindent} (see +Chapter~\ref{displaymath}) and surrounded by +\cs{abovedisplayskip} and \cs{belowdisplayskip} glue. + +%\spoint Vertical alignments: \cs{valign} +\subsection{Vertical alignments: \cs{valign}} + +Vertical alignments are `rotated' horizontal alignments: +\term vertical alignment\par +they are placed on the surrounding horizontal lists, +and yield a row of columns. The \cs{spacefactor} value +is treated the same way as the \cs{prevdepth} for horizontal +alignments: the value current before the alignment is used +for the first column, and the value reached after the last column +is used after the alignment. In between columns the \cs{spacefactor} +value is~1000. + +Each entry is in a group of its own, and it is processed +in internal vertical mode. + +%\spoint Material between the lines: \cs{noalign} +\subsection{Material between the lines: \cs{noalign}} + +Material that has to be contained in the alignment, but +should not be treated as an entry or series of entries, +\cstoidx noalign\par +can be given by +\begin{disp}\cs{noalign}\gr{filler}\lb\gr{vertical mode material}\rb +\end{disp} for horizontal alignments, and +\begin{disp}\cs{noalign}\gr{filler}\lb\gr{horizontal mode material}\rb +\end{disp} for vertical alignments. + +Examples are +\begin{verbatim} +\noalign{\hrule} +\end{verbatim} +for drawing a horizontal rule +between two lines of an \cs{halign}, +and \begin{verbatim} +\noalign{\penalty100} +\end{verbatim} +for discouraging a page break (or line break) in +between two rows (columns) of an \cs{halign} (\cs{valign}). + +%\spoint Size of the alignment +\subsection{Size of the alignment} + +The \gr{box specification} can be used to give the alignment +a predetermined size: for instance +\begin{verbatim} +\halign to \hsize{ ... } +\end{verbatim} +Glue contained in the entries of the alignment has no role in this; +any stretch or +shrink required is taken from the \cs{tabskip} glue. +This is explained below. + +%\point The preamble +\section{The preamble} + +Each line in an alignment is terminated by \cs{cr}; +the first line is called the {\it template line}. +It is of the form +\begin{disp}\n{$u_1$\#$v_1$\&...\&$u_n$\#$v_n$}\cs{cr}\end{disp} +where each $u_i$, $v_i$ is a (possibly empty) arbitrary sequence +of tokens, and the template entries are separated by +the {\italic alignment tab +\term alignment tab\par +character} (\n\&~in plain \TeX), +that is, any character of category~4. + +A $u_i$\n\#$v_i$ sequence is the template that will be +used for the $i\,$th column: whatever sequence $\alpha_i$ +the user specifies +as the entry for that column will be inserted at the +parameter character. The sequence $u_i\alpha_iv_i$ is +then processed to obtain the actual entry for the $i\,$th +column on the current line. See below for more details. + +The length $n$ of the template line need +not be equal to the actual number of columns in the alignment: +the template is used only for as many items as are specified +on a line. Consider as an example +\begin{verbatim} +\halign{a#&b#&c#\cr 1&2\cr 1\cr} +\end{verbatim} +which has a three-item template, but the rows have only +one or two items. The output of this is +\begin{disp}\leavevmode\vbox{\halign{a#&b#&c#\cr 1&2\cr 1\cr}}\end{disp} + +%\spoint Infinite preambles +\subsection{Infinite preambles} + +For the case where the number of columns is not known in advance, +for instance if the alignment is to be used in a macro where +the user will specify the columns, it is possible to +specify that a trailing piece of the +preamble can be repeated arbitrarily many times. +By preceding it with \n\&, an entry can be marked as the +start of this repeatable part of the preamble. +See the example of \cs{matrix} below. + +When the whole preamble is to be repeated, there will be +an alignment tab character at the start of the first entry: +\begin{verbatim} +\halign{& ... & ... \cr ... } +\end{verbatim} +If a starting portion of the preamble is to be exempted from +repetition, a double alignment tab will occur: +\begin{verbatim} +\halign{ ... & ... & ... && ... & ... \cr ... } +\end{verbatim} + +The repeatable part need not be used an integral +number of times. The alignment rows can end at any time; +the rest of the preamble is then not used. + +%\spoint Brace counting in preambles +\subsection{Brace counting in preambles} + +Alignments may appear inside alignments, so \TeX\ uses the +following rule to determine to which alignment +an \n\& or \cs{cr} control sequence belongs: +\begin{disp} All tab characters and \cs{cr} tokens of an alignment + should be on the same level of grouping.\end{disp} +From this it follows that tab characters and \cs{cr} tokens +can appear inside an entry if they are nested in braces. +This makes it possible to have nested alignments. + +%\spoint Expansion in the preamble +\subsection{Expansion in the preamble} + +All tokens in the preamble \ldash apart from the tab characters \rdash +are stored for insertion in the entries of the alignment, +but a token preceded by \csidx{span} is expanded while +the preamble is scanned. See below for the function of +\cs{span} in the rest of the alignment. + +%\spoint \cs{tabskip} +\subsection{\cs{tabskip}} + +Entries in an alignment are set to take the width of the +largest element in their column. +Glue for separating columns can be specified by assigning +to \csidx{tabskip}. +\altt +\TeX\ inserts this glue in +between each pair of columns, and before the first and after the +last column. + +The value of \cs{tabskip} that holds outside the alignment is +used before the first column, and after all subsequent columns, +unless the preamble contains assignments to \cs{tabskip}. +Any assignment to \cs{tabskip} is executed while \TeX\ is scanning +the preamble; the value that holds when a tab character is +reached will be used at that place in each row, and after all subsequent +columns, unless further assignments occur. +The value of \cs{tabskip} that holds when \cs{cr} is reached +is used after the last column. + +Assignments to \cs{tabskip} in the preamble are local to the +alignment, but not to the entry where they are given. +These assignments are ordinary glue assignments: +they remove any optional trailing space. + +As an example, in the following table there is no tabskip +glue before the first and after the last column; +in between all columns there is stretchable tabskip. +\begin{verbatim} +\tabskip=0pt \halign to \hsize{ + \vrule#\tabskip=0pt plus 1fil\strut& + \hfil#\hfil& \vrule#& \hfil#\hfil& \vrule#& \hfil#\hfil& + \tabskip=0pt\vrule#\cr + \noalign{\hrule} + &\multispan5\hfil Just a table\hfil&\cr + \noalign{\hrule} + &one&&two&&three&\cr &a&&b&&c&\cr + \noalign{\hrule} + } +\end{verbatim} +The result of this is +\begin{disp}\PopListLevel +\leavevmode\message{single indent and sufficient vertical}% +\hbox{\leftskip0pt \rightskip0pt + \vbox{\offinterlineskip +\tabskip=0pt \halign to \hsize{\strut + \vrule#\tabskip=0pt plus 1fil\strut& + \hfil#\hfil& \vrule#& \hfil#\hfil& + \vrule#& \hfil#\hfil& + \tabskip=0pt\vrule#\cr + \noalign{\hrule} + &\multispan5\hfil Just a table\hfil&\cr + \noalign{\hrule} + &one&&two&&three&\cr + &a&&b&&c&\cr + \noalign{\hrule} + }}}\end{disp} +All of the vertical rules +of the table are in a separate column. This is the only way +to get the space around the items to stretch. + +%\point The alignment +\section{The alignment} + +After the template line any number of lines terminated by \cs{cr} +can follow. \TeX\ reads all of these lines, processing the +entries in order to find the maximal width (height) in +each column (row). +Because all entries are kept in memory, +long tables can overflow \TeX's main memory. +For such tables it is better to write a special-purpose macro. + +%\spoint Reading an entry +\subsection{Reading an entry} + +Entries in an alignment are composed of the +constant $u$ and $v$ parts +of the template, and the variable $\alpha$ part. +Basically \TeX\ forms the sequence of tokens $u\alpha v$ +and processes this. However, there are two special cases +where \TeX\ has to expand before it forms this sequence. + +Above, the \cs{noalign} command was described. +Since this requires a different treatment from other +alignment entries, +\TeX\ expands, after it has read a \cs{cr}, +the first token of the first $\alpha$ string +of the next line to +see whether that is or expands to \cs{noalign}. +Similarly, for all entries +in a line the first token is expanded to see +whether it is or expands to \cs{omit}. This control sequence +will be described below. + +Entries starting with an \cs{if...} conditional, or a macro +expanding to one, may be misinterpreted owing to this +premature expansion. For example, +\begin{verbatim} +\halign{$#$\cr \ifmmode a\else b\fi\cr} +\end{verbatim} +will give +\begin{disp}\leavevmode + \vbox{\halign{$#$\cr \ifmmode a\else b\fi\cr}}\end{disp} +because the conditional is evaluated before math mode has been set up. +The solution is, as in many other cases, to insert a +\cs{relax} control sequence to stop the expansion. +Here the \cs{relax} has to be inserted at the start of the +alignment entry. + +If neither \cs{noalign} nor \cs{omit} (see below) is found, +\TeX\ will process an input stream composed +of the $u$ part, the $\alpha$ tokens +(which are delimited by either \n\& or \cs{span}, see below), +and the $v$ part. + +Entries are delimited by \n\&, \cs{span}, or \cs{cr}, but +only if such a token occurs on the same level of grouping. +This makes it possible to have an alignment as an entry of +another alignment. + +%\spoint Alternate specifications: \cs{omit} +\subsection{Alternate specifications: \cs{omit}} + +The template line will rarely be sufficient to describe +all lines of the alignment. For lines where items should be +set differently the command \csidx{omit} exists: +if the first token in an entry is (or expands to) \cs{omit} +the trivial template \n\# is used instead of +what the template line specifies. + +\begin{example} The following alignment uses the same template for +all columns, but in the second column an \cs{omit} command +is given. +\begin{verbatim} +\tabskip=1em +\halign{&$<#>$\cr a&\omit (b)&c \cr} +\end{verbatim} +The output of this is +\begin{disp}\leavevmode\vbox{\tabskip=1em +\halign{&$<#>$\cr a&\omit (b)&c \cr}} +\end{disp} +\end{example} + +%\spoint Spanning across multiple columns: \cs{span} +\subsection{Spanning across multiple columns: \cs{span}} + +Sometimes it is desirable to have material spanning several +columns. The most obvious example is that of a heading above +a table. For this \TeX\ provides the \cs{span} command. + +Entries are delimited either by \n\&, by \cs{cr}, or by \csidx{span}. +In the last case \TeX\ will omit the tabskip glue that +would normally follow the entry thus delimited, and +it will typeset the material just read plus the following +entry in the joint space available. + +As an example, +\begin{verbatim} +\tabskip=1em +\halign{&#\cr a&b&c&d\cr a&\hrulefill\span\hrulefill&d\cr} +\end{verbatim} +gives +\begin{disp}\leavevmode\vbox{\tabskip=1em +\halign{&#\cr a&b&c&d\cr a&\hrulefill\span\hrulefill&d\cr}} +\end{disp} Note that there is no tabskip glue in between the +two spanned columns, but there is tabskip glue before the +\alt +first column and after the last. + +Using the \cs{omit} command this same alignment could +have been generated as +\begin{verbatim} +\halign{&#\cr a&b&c&d\cr a&\hrulefill\span\omit&d\cr} +\end{verbatim} + +The \cs{span}\cs{omit} combination is used in the +plain \TeX\ macro +\cs{multispan}: for instance +\begin{disp}\cs{multispan4}\quad gives\quad \verb>\omit\span\omit\span\omit\span\omit> +\end{disp} which spans across three tabs, and removes the templates +of four entries. +Repeating the above example once again: +\begin{verbatim} +\halign{&#\cr a&b&c&d\cr a&\multispan2\hrulefill&d\cr} +\end{verbatim} +The argument of \cs{multispan} is a single token, +not a number, +so in order to span more than 9 columns the argument +should be enclosed in braces, for instance \verb>\multispan{12}>. +\alt +Furthermore, a space after a single-digit argument +will wind up in the output. + +For a `low budget' solution to spanning columns plain \TeX\ has the +macro \csidx{hidewidth}, defined by +\begin{verbatim} +\newskip\hideskip \hideskip=-1000pt plus 1fill +\def\hidewidth{\hskip\hideskip} +\end{verbatim} +Putting \cs{hidewidth} at the beginning or end of an alignment entry +will make its width zero, with the material in the entry +sticking out to the left or right respectively. + + +%\spoint Rules in alignments +\subsection{Rules in alignments} + +Horizontal rules inside a horizontal alignment will mostly +\term rules in alignments\par +\howto Draw rules in an alignment\par +be across the width of the alignment. The easiest way +to attain this is to use \begin{verbatim} +\noalign{\hrule} +\end{verbatim} +lines inside the alignment. If the alignment is contained +in a vertical box, lines above and below the alignment +can be specified with +\begin{verbatim} +\vbox{\hrule \halign{...} \hrule} +\end{verbatim} +The most general way to get horizontal lines in an alignment +is to use +\cstoidx multispan\par +\begin{disp}\cs{multispan}$\,n$\cs{hrulefill}\end{disp} +which can be used to underline arbitrary adjacent columns. + +Vertical rules in alignments take some more care. +Since a horizontal alignment breaks up into +horizontal boxes that will be placed on a vertical list, +\TeX\ will insert baselineskip glue in between the rows +of the alignment. If vertical rules in adjacent rows +are to abut, it is necessary to prevent baselineskip glue, +for instance by the \cs{offinterlineskip} macro. + +In order to ensure that rows will still be properly spaced +it is then necessary to place a {\italic strut\/} +somewhere in the preamble. +A~strut is an invisible object with a certain height +and depth. Putting that in the preamble guarantees that +every line will have at least that height and depth. +In the plain format \csidx{strut} is +defined statically as +\begin{verbatim} +\vrule height8.5pt depth3.5pt width0pt +\end{verbatim} +so this must be changed when other fonts or sizes are used. + +It is a good idea to use a whole column for a~vertical +rule, that is, to write +\begin{verbatim} +\vrule#& +\end{verbatim} +in the preamble and +to leave the corresponding entry in the alignment empty. +Omitting the vertical rule can then be done by specifying \cs{omit}, +and the size of the rule can be specified explicitly by +putting, for instance, +\hbox{\n{height 15pt}} in the entry instead of leaving +it empty. Of course, tabskip glue will now be specified to the +left and right of the rule, so some extra tabskip assignments +may be needed in the preamble. + +%\spoint End of a line: \cs{cr} and \cs{crcr} +\subsection{End of a line: \cs{cr} and \cs{crcr}} + +All lines in an alignment are terminated by the \csidx{cr} control +sequence, including the last line. +\TeX\ is not able to infer from +a closing brace in the $\alpha$~part that the +alignment has ended, because an unmatched +closing brace is perfectly valid in +an alignment entry; it may match an opening brace in +the $u$~part of the corresponding preamble entry. + +\TeX\ has a primitive command \csidx{crcr} that is equivalent +to \cs{cr}, but it has no effect if it immediately follows +a~\cs{cr}. +Consider as an example the definition in plain \TeX\ +of \csidx{cases}: +\begin{verbatim} +\def\cases#1{% + \left\{\,\vcenter{\normalbaselines\m@th + \ialign{ $##\hfil$& \quad##\hfil \crcr #1\crcr}}% + \right.} +\end{verbatim} +Because of the \cs{crcr} after the user argument \verb.#1., +the following two applications of this macro +\begin{disp}\verb>\cases{1&2\cr 3&4}>\quad and\quad \verb>\cases{1&2\cr 3&4\cr}>\end{disp} +both work. In the first case the \cs{crcr} in the macro +definition ends the last line; +in the second case the user's \cs{cr} ends the line, +and the \cs{crcr} is redundant. + +After \cs{cr} and after a non-redundant \cs{crcr} the +\gr{token parameter} \csidx{everycr} is inserted. +This includes the \cs{cr} terminating the template line. + +%\point Example: math alignments +\section{Example: math alignments} + +The plain format has several alignment macros that function +in math mode. One example is \csidx{matrix}, defined by +\begin{verbatim} +\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th + \ialign{\hfil$##$\hfil && \quad\hfil$##$\hfil\crcr + \mathstrut\crcr + \noalign{\kern-\baselineskip} + #1\crcr + \mathstrut\crcr + \noalign{\kern-\baselineskip}}}\,} +\end{verbatim} +This uses a repeating (starting with~\verb>&&>) second preamble entry; +each entry is centred by an \cs{hfil} before and after it, +and there is a \cs{quad} of space in between columns. +Tabskip glue was not used for this, because there should not +be any glue preceding or following the matrix. + +The combination of a \cs{mathstrut} and \verb>\kern-\baselineskip> +above and below the matrix increases the vertical size +such that two matrices with the same number of rows will have +the same height and depth, which would not otherwise be the case +if one of them had subscripts in the last row, but the other +not. The \cs{mathstrut} causes interline glue to be inserted +and, because it has a size equal to \cs{baselineskip}, +the negative kern will effectively leave only the interline glue, +thereby buffering any differences in the first and last line. +Only to a certain point, of course: objects bigger than the +opening brace will still result in a different height or depth of the +matrix. + +Another, more +complicated, example of an alignment for math mode is \cs{eq\-alignno}. +\cstoidx eqalignno\par\cstoidx centering\par +\begin{verbatim} +\def\eqalignno#1{\begin{disp}l@y \tabskip\centering + \halign to\displaywidth{ + \hfil$\@lign\displaystyle{##}$% -- first column + \tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfil% -- second column + \tabskip\centering + &\llap{$\@lign##$}% -- third column + \tabskip\z@skip\crcr % end of the preamble + #1\crcr}} +\end{verbatim} +Firstly, the tabskip is set to zero after the equation +number, so this number is set flush with the right margin. +Since it is placed by \cs{llap}, its effective width +is zero. Secondly, the tabskip between the +first and second columns is also zero, and the tabskip +before the first column and after the second is +\alt +\cs{centering}, which is \n{0pt plus 1000pt minus 1000pt}, +so the first column and second are jointly centred +in the \cs{hsize}. Note that, because of the +\n{minus 1000pt}, these two columns will happily go +outside the left and right margins, overwriting any +equation numbers. + + +% \begin{comment} +% \endinput +% %\spoint Error messages +% \subsection{Error messages} + +% \aftergroup in alignment? + +% \end{comment} +%%%% end of input file [align] + +%\InputFile:page +%%%% this is input file [page] +%\subject[page:shape] Page Shape +\endofchapter +\chapter{Page Shape}\label{page:shape} + +This chapter treats some of the parameters that +determine the size of the page and how it appears on paper. + +\begin{inventory} +\item [\cs{topskip}] + Minimum distance between the top of the page box + and the baseline of the first box on the page. + Plain \TeX\ default:~\n{10pt} + +\item [\cs{hoffset \cs{voffset}}] +\mdqon + Distance by which the page is shifted right/""down +\mdqoff + with respect to the reference point. + +\item [\cs{vsize}] + Height of the page box. + Plain \TeX\ default:~\n{8.9in} + +\item [\cs{maxdepth}] + Maximum depth of the page box. + Plain \TeX\ default:~\n{4pt} + +\item [\cs{splitmaxdepth}] + Maximum depth of a box split off by a \cs{vsplit} operation. + Plain \TeX\ default:~\cs{maxdimen} + +\end{inventory} + +%\point The reference point for global positioning +\section{The reference point for global positioning} + +It is a \TeX\ convention, to which output device drivers +\term page positioning\par +must adhere, that the top left point of the page is +one inch from the page edges. Unfortunately this +may lead to lots of trouble, for instance if a printer +(or the page description language it uses) +takes, say, the {\em lower\/} left corner as the +reference point, and is factory set to US paper sizes, +but is used with European standard A4 paper. + +The page is shifted on the paper if one assigns non-zero +values to \csidx{hoffset} or \csidx{voffset}: positive values +shift to the right and down respectively. + +%\point \cs{topskip} +\section{\protect\cs{topskip}} + +The \csidx{topskip} ensures to a certain point +that the first baseline of a page +will be at the same location from page to page, +even if font sizes +are switched between pages or if the first line has +no ascenders. + +Before the first box on each page some glue is inserted. +This glue has the same stretch and shrink as \cs{topskip}, but +the natural size is the natural size of \cs{topskip} +minus the height of the first box, or zero if this +would be negative. + +Plain \TeX\ sets \cs{topskip} to {\tt 10pt}. +Thus the top lines of pages will have their baselines +at the same place if +the top portion of the characters is ten point or less. +For the Computer Modern fonts this condition is satisfied +if the font size is less than (about) 13~points; +for larger fonts +the baseline of the top line will drop. + +The height of the page box for a page containing only +text (and assuming a zero \cs{parskip}) +will be the \cs{topskip} plus a number of times +the \cs{baselineskip}. Thus one can define a macro +to compute the \cs{vsize} from the number of lines +on a page: +\howto Specify page height in lines\par +\begin{verbatim} +\def\HeightInLines#1{\count@=#1\relax + \advance\count@ by -1\relax + \vsize=\baselineskip + \multiply\vsize by \count@ + \advance\vsize by \topskip} +\end{verbatim} +Calculating the \cs{vsize} this way will prevent +underfull boxes for text-only pages. + +In cases where the page does not start with a line of text +(for instance a rule), the topskip may give unwanted effects. +To prevent these, start the page with +\begin{verbatim} +\hbox{}\kern-\topskip +\end{verbatim} +followed by what you wanted on top. + +Analogous to the \cs{topskip}, there is a \cs{splittopskip} +for pages generated by a \cs{vsplit} operation; see +the next chapter. + +%\point Page height and depth +\section{Page height and depth} + +\TeX\ tries to build pages as a \cs{vbox} of height \csidx{vsize}; +\alt +see also \cs{pagegoal} in the next chapter. + +If the last item on a page has an excessive depth, +\term page depth\par +that page would be noticeably longer than other pages. +To prevent this phenomenon \TeX\ uses \csidx{maxdepth} as +the maximum depth of the page box. If adding an item to the +page would make the depth exceed this quantity, then the +reference point of the page is moved down to make the depth +exactly \cs{maxdepth}. + +The `raggedbottom' effect is obtained in plain \TeX\ +\cstoidx raggedbottom\par +by giving the \cs{topskip} some finite stretchability: +\hbox{\n{10pt plus 60pt}}. +Thus the natural height of box~255 can vary when it reaches +the output routine. +Pages are then shipped out (more or less) as +\begin{verbatim} +\dimen0=\dp255 \unvbox255 +\ifraggedbottom \kern-\dimen0 \vfil \fi +\end{verbatim} +The \cs{vfil} causes the topskip to be set at natural +width, so the effect is one of a fixed top line and a +variable bottom line of the page. + +Before \cs{box255} is unboxed in the plain \TeX\ output routine, +\cs{boxmaxdepth} is set to \cs{maxdepth} +so that this box will made under the same assumptions +that the page builder used when putting together \cs{box255}. + +The depth of box split off by a \cs{vsplit} operation +is controlled by the \cs{splitmaxdepth} parameter. + +%\subject[page:break] Page Breaking +\endofchapter +\chapter{Page Breaking}\label{page:break} + +This chapter treats the `page builder': the part of \TeX\ +that decides where to break the main vertical list into pages. +The page builder operates before the output routine, +and it hands its result in \cs{box255} to the output routine. + +\begin{inventory} +\item [\cs{vsplit}] + Split of a top part of a box. This is comparable + with page breaking. + +\item [\cs{splittopskip}] + Minimum distance between the top of what remains after a + \cs{vsplit} operation, and the first item in that box. + Plain \TeX\ default:~\n{10pt} + +\item [\cs{pagegoal}] + Goal height of the page box. This starts at \cs{vsize}, + and is diminished by heights of insertion items. + +\item [\cs{pagetotal}] + Accumulated natural height of the current page. + +\item [\cs{pagedepth}] + Depth of the current page. + +\item [\cs{pagestretch}] + Accumulated zeroth-order stretch of the current page. + +\item [\cs{pagefilstretch}] + Accumulated first-order stretch of the current page. + +\item [\cs{pagefillstretch}] + Accumulated second-order stretch of the current page. + +\item [\cs{pagefilllstretch}] + Accumulated third-order stretch of the current page. + +\item [\cs{pageshrink}] + Accumulated shrink of the current page. + +\item [\cs{outputpenalty}] + Value of the penalty at the current page break, + or $10\,000$ if the break was not at a penalty. + +\item [\cs{interlinepenalty}] + Penalty for breaking a page between lines of a paragraph. + Plain \TeX\ default:~\n{0} + +\item [\cs{clubpenalty}] + Additional penalty for breaking a page after + the first line of a paragraph. + Plain \TeX\ default:~\n{150} + +\item [\cs{widowpenalty}] + Additional penalty for breaking a page before + the last line of a paragraph. + Plain \TeX\ default:~\n{150} + +\item [\cs{displaywidowpenalty}] + Additional penalty for breaking a page before the last line + above a display formula. + Plain \TeX\ default:~\n{50} + +\item [\cs{brokenpenalty}] + Additional penalty for breaking a page after a hyphenated line. + Plain \TeX\ default:~\n{100} + +\item [\cs{penalty}] + Place a penalty on the current list. +\item [\cs{lastpenalty}] + If the last item on the list was a penalty, the value of this. +\item [\cs{unpenalty}] + Remove the last item of the current list if this + was a penalty. + +\end{inventory} + +%\point The current page and the recent contributions +\section{The current page and the recent contributions} + +The main vertical list of \TeX\ is divided in two parts: +\term current page\par\term recent contributions\par +\term page builder\par +the `current page' and the list of `recent contributions'. +Any material that is added to the main vertical list is +appended to the recent contributions; the act of moving +the recent contributions to the current page is known +as `exercising the page builder'. + +Every time something is moved to the current page, \TeX\ +computes the cost of breaking the page at that point. +If it decides that it is past the optimal point, +the current page up to +\altt +the best break so far +is put in \cs{box255} and the remainder of +the current page is moved back on top of the recent contributions. +If the page is broken at a penalty, +\label{break:penalty}% +that value is recorded in \cs{outputpenalty}, and +a penalty of size $10\,000$ is placed on top of the +recent contributions; otherwise, \csidx{outputpenalty} +is set to~$10\,000$. + +If the current page is empty, discardable items that are moved +from the recent contributions are discarded. This is the mechanism +that lets glue disappear after a page break and at the top of +the first page. When the first non-discardable item is moved +to the current page, the \cs{topskip} glue is inserted; +see the previous chapter. + +The workings of the page builder can be made visible by +setting \cs{tracingpages} to some positive value +(see Chapter~\ref{trace}). + +%\point Activating the page builder +\section{Activating the page builder} + +The page builder comes into play in the +following circumstances. +\begin{itemize}\item Around paragraphs: after the \cs{everypar} + tokens have been inserted, and after the paragraph has been + added to the vertical list. See the end of this chapter for + an example. +\item Around display formulas: after the \cs{everydisplay} + tokens have been inserted, and after the display has been + added to the list. +\item After \cs{par} commands, boxes, insertions, + and explicit penalties in vertical mode. +\item After an output routine has ended. \end{itemize} +In these places the page builder moves the recent +contributions to the current page. Note that \TeX\ need not be +in vertical mode when the page builder is exercised. +In horizontal mode, activating the page builder +serves to move preceding vertical glue (for example, \cs{parskip}, +\cs{abovedisplayskip}) to the page. + +The \cs{end} command \ldash which is only allowed in +external vertical mode \rdash terminates a \TeX\ job, but only if the +main vertical list is empty and \cs{deadcycles}${}=0$. +If this is not the case the combination +\label{end:play}% +\begin{disp}\verb>\hbox{}\vfill\penalty>$-2^{30}$\end{disp} +is appended, which forces the output routine to act. + +%\point Page length bookkeeping +\section{Page length bookkeeping} + +The height and depth of the page box that reaches the output +\term page length\par +routine are determined by \cs{vsize}, \cs{topskip}, +and~\cs{maxdepth} as described in the previous chapter. +\TeX\ places the \cs{topskip} glue +when the first box is placed on the current page; the +\cs{vsize} and \cs{maxdepth} are read when the first +box or insertion occurs on the page. Any subsequent changes to these +parameters will not be noticeable until the next page or, +more strictly, until after the output routine has been called. + +After the first box, rule, or insertion on the current page +the \cs{vsize} is recorded in \cs{pagegoal}, +and its value is not looked at until \cs{output} +has been active. +Changing \cs{pagegoal} does have an effect on the current +page. +When the page is empty, +the pagegoal is \cs{maxdimen}, and \cs{pagetotal} is zero. + +Accumulated dimensions and stretch are available in +the parameters \cs{pagetotal}, \cs{pagedepth}, +\cs{pagestretch}, \cs{pagefilstretch}, \cs{pagefillstretch}, +\cs{pageshrink}, +and \cs{pagefilllstretch}. +\cstoidx pagetotal\par\cstoidx pagedepth\par +\cstoidx pagestretch\par\cstoidx pagefilstretch\par +\cstoidx pagefillstretch\par +\cstoidx pageshrink\par\cstoidx pagefilllstretch\par +They are set by the page builder. The stretch and +shrink parameters are updated every time glue is added +to the page. The depth parameter becomes zero +if the last item was kern or glue. + +These parameters are \gr{special dimen}s; an assignment +to any of them is an \gr{intimate assignment}, +and it is automatically global. + +%\point Breakpoints +\section{Breakpoints} + +%\spoint Possible breakpoints +\subsection{Possible breakpoints} + +Page breaks can occur at the same kind of locations where +\term breakpoints in vertical lists\par +line breaks can occur: +\begin{itemize}\item at glue that is preceded by a non-discardable +item;\item at a kern that is immediately followed by glue; +\item at a penalty.\end{itemize} +\TeX\ inserts interline glue and various sorts of +interline penalties when the lines of a paragraph are +added to the vertical list, so there will usually be +sufficient breakpoints on the page. + +%\spoint Breakpoint penalties +\subsection{Breakpoint penalties} + +If \TeX\ decides to break a page at a penalty item, this +penalty will, most of the time, be one that +has been inserted automatically +between the lines of a paragraph. + +If the last item on a list (not necessarily a vertical list) +\alt +is a penalty, the value of this is recorded +in the parameter \csidx{lastpenalty}. If the item is other than +a penalty, this parameter has the value zero. +The last penalty of a list can be removed with the command +\csidx{unpenalty}. See Section~\ref{varioset} for an example. +\message{Spoint ref varioset} + +Here is a list of such penalties\term penalties in vertical mode\par: +\begin{inventory} +\item [\csidx{interlinepenalty}] + Penalty for breaking a page between lines of a paragraph. + In plain \TeX\ this is zero, so no penalty is added in + between lines. \TeX\ can then find a valid breakpoint at the + \cs{baselineskip} glue. + +\item [\csidx{clubpenalty}] + Extra penalty for breaking a page after the first line of a paragraph. + In plain \TeX\ this is~\n{150}. + This amount, and the following penalties, are + added to the \cs{interlinepenalty}, and + a penalty of the resulting size is inserted after the + \cs{hbox} containing the first line of a paragraph + instead of the \cs{interlinepenalty}. + +\item [\csidx{widowpenalty}] + Extra penalty for breaking a page before the last line of a paragraph. + In plain \TeX\ this is~\n{150}. + +\item [\csidx{displaywidowpenalty}] + Extra penalty for breaking a page before the last line + above a display formula. The default value in plain \TeX\ + is~\n{50}. + +\item [\csidx{brokenpenalty}] + Extra penalty for breaking a page after a hyphenated line. + The default value in plain \TeX\ is~\n{100}. +\end{inventory} +If the resulting penalty is zero, it is not placed. + +Penalties can also be inserted by the user. For instance, +the plain format has macros to encourage (possibly, force) +or prohibit page breaks\cstoidx penalty\par: +\begin{verbatim} +\def\break{\penalty-10000 } % force break +\def\nobreak{\penalty10000 } % prohibit break +\def\goodbreak{\par\penalty-500 } % encourage page break +\end{verbatim} +Also, \verb>\vadjust{\penalty ... }> is a way of getting +penalties in the vertical list. This can be used to +discourage or encourage page breaking after a certain +line of a paragraph. + +%\spoint Breakpoint computation +\subsection{Breakpoint computation} + +\advance\rightskip by 5.5cm + +Whenever an item is moved to the current page, \TeX\ +\term page breaking\par\term breakpoints, computation of\par +\vadjust{\advance\hsize by -5.5cm + \hbox to \hsize{\hfil\rlap{\hskip.4cm\vtop to 0pt + {\kern-2\baselineskip + \SansSerif %\pointSize:8 \Style:roman + \parindent0pt \offinterlineskip + \def\tbox#1{\hbox{\quad\quad #1% + \vrule height 10pt depth3pt width0cm }} + \hbox + {\vrule width\lw \kern-\lw + \vbox{\hsize=5cm + \hrule height\lw \ \vskip0cm + \kern40pt + \tbox{underfull page} + \tbox{$b=10\,000$} + \kern40pt + \hrule height\lw + \kern8pt + \tbox{feasible breakpoints} + \tbox{$b<10\,000$} + \kern8pt + \hrule height\lw + \kern8pt + \tbox{overfull page} + \tbox{$b=\infty$} + \kern3pt + \tbox{.\vrule height3.5pt depth1pt width0cm} + \tbox{.\vrule height3.5pt depth1pt width0cm} + \tbox{.\vrule height3.5pt depth1pt width0cm} + \kern8pt + }% + \kern-\lw \vrule width\lw}% + \vss}}}} +computes the penalty $p$ and the badness $b$ associated with +breaking the page at that place. From the penalty and +the badness the cost $c$ of breaking is computed. + +The place of least cost is remembered, and when +the cost is infinite, that is, the page is overfull, or +when the penalty is $p\leq-10\,000$, the current page is broken +at the (last remembered) place of least cost. +The broken-off piece is then +put in \cs{box255} and the output routine token list +is inserted. Box 255 is always given a height of \cs{vsize}, +regardless of how much material it has. + +The badness calculation is based on the amount of stretching +or shrinking that is necessary to fit the page in +a box with height \cs{vsize} +and maximum depth \cs{maxdepth}. This calculation is +the same as for line breaking (see Chapter~\ref{glue}). +Badness is a value $0\leq b\leq 10\,000$, except when +pages are overfull; then~$b=\infty$. + +\advance\rightskip by -5.5cm + +Some penalties are implicitly inserted by \TeX, +for instance the \cs{interlinepenalty} +which is put in between every pair of lines of a paragraph. +Other penalties can +be explicitly inserted by the user or a user macro. +A~penalty +value $p\geq10\,000$ inhibits breaking; a penalty +$p\leq-10\,000$ (in external vertical mode) +\alt +forces a page break, and immediately +activates the output routine. + +Cost calculation proceeds as follows: +\begin{enumerate} \item When a penalty is so low that it forces +a page break and immediate invocation of the output routine, +but the page is not overfull, that is +\begin{disp}$b<\infty\quad\hbox{and}\quad p\leq-10\,000$\end{disp} +the cost is equal to the penalty:~$c=p$. + +\item When penalties do not force anything, and the page is not +overfull, that is +\begin{disp}$b<\infty\quad\hbox{and}\quad |p|<10\,000$\end{disp} +the cost is~$c=b+p$. + +\item For pages that are very bad, that is +\begin{disp}$b=10\,000\quad\hbox{and}\quad |p|<10\,000$\end{disp} +the cost is~$c=10\,000$. + +\item An overfull page, that is +\begin{disp}$b=\infty\quad\hbox{and}\quad p<10\,000$\end{disp} +gives infinite cost:~$c=\infty$. +In this case \TeX\ decides that the optimal break point +must have occurred earlier, and it invokes the output routine. +Values of \cs{insertpenalties} (see Chapter~\ref{insert}) +that exceed $10\,000$ +also give infinite cost. +\end{enumerate} + +The fact that a penalty $p\leq-10\,000$ activates +the output routine is used extensively +in the \LaTeX\ output routine: +the excess $\mathopen|p\mathclose|-10\,000$ is +a code indicating the reason for calling the output routine; +see also the second example in the next chapter. + +%\point[vsplit] \cs{vsplit} +\section{\protect\cs{vsplit}} +\label{vsplit} + +The page-breaking operation is available to the user +through the \csidx{vsplit} operation. + +\begin{example} \begin{verbatim} +\setbox1 = \vsplit2 to \dimen3 +\end{verbatim} +assigns to box~1 the top part of size \cs{dimen3} +of box~2. This material is actually removed from box~2. +Compare this with splitting off a chunk of size \cs{vsize} +from the current page. +\end{example} + +The extracted +result of \begin{disp}\cs{vsplit}\gr{8-bit number}\n{to}\gr{dimen} +\end{disp} is a box with the following properties. +\begin{itemize} \item Height equal to the specified \gr{dimen}; \TeX\ will + go through the original box register (which must contain + a vertical box) to find the best breakpoint. This may + result in an underfull box. +\item Depth at most \csidx{splitmaxdepth}; this is analogous to + the \cs{maxdepth} for the page box, rather than the \cs{boxmaxdepth} + that holds for any box. +\item A first and last mark in the \cs{splitfirstmark} and + \cs{splitbotmark} registers. +\end{itemize} + +The remainder of the \cs{vsplit} operation is a box where +\begin{itemize} \item all discardables have been removed + from the top; +\item glue of size \csidx{splittopskip} has been inserted on top; + if the box being split was box~255, it + already had \cs{topskip} glue on top; +\item its depth has been forced to be at most \cs{splitmaxdepth}. +\end{itemize} + +The bottom of the original box is always a valid breakpoint +for the \cs{vsplit} operation. If this breakpoint is taken, +the remainder box register is void. The extracted box +can be empty; it is only void if the original box +was void, or not a vertical box. + +Typically, the \cs{vsplit} operation is used to split off part +of \cs{box255}. By setting \cs{splitmaxdepth} equal to \cs{boxmaxdepth} +the result is something that could have been made by \TeX's page +builder. After pruning the top of \cs{box255}, the +mark registers \cs{firstmark} and \cs{botmark} contain the first +and last marks on the remainder of box~255. +See the next chapter for more information on marks. + +%\point Examples of page breaking +\section{Examples of page breaking} + +%\spoint Filling up a page +\subsection{Filling up a page} + +Suppose a certain vertical box is too large +to fit on the remainder of the page. +Then \begin{verbatim} +\vfil\vbox{ ... } +\end{verbatim} +is the wrong way +to fill up the page and push the box to the next. +\TeX\ can only break at the start of the glue, and +the \cs{vfil} is discarded after the break: the result +is an underfull, or at least horribly stretched, page. +On the other hand, +\begin{verbatim} +\vfil\penalty0 % or any other value +\vbox{ ... } +\end{verbatim} +is the correct way: \TeX\ will break +at the penalty, and the page will be filled. + +%\spoint Determining the breakpoint +\subsection{Determining the breakpoint} + +In the following examples the \cs{vsplit} operation is +used, which has the same +mechanism as page breaking. + +Let the macros and +parameter settings +\begin{verbatim} +\offinterlineskip \showboxdepth=1 +\def\High{\hbox{\vrule height5pt}} +\def\HighAndDeep{\hbox{\vrule height2.5pt depth2.5pt}} +\end{verbatim} +be given. + +First let us consider +an example where a vertical list is simply stretched +in order to reach a break point. +\begin{verbatim} +\splitmaxdepth=4pt +\setbox1=\vbox{\High \vfil \HighAndDeep} +\setbox2=\vsplit1 to 9pt +\end{verbatim} +gives \begin{verbatim} +> \box2= +\vbox(9.0+2.5)x0.4, glue set 1.5fil +.\hbox(5.0+0.0)x0.4 [] +.\glue 0.0 plus 1.0fil +.\glue(\lineskip) 0.0 +.\hbox(2.5+2.5)x0.4 [] +\end{verbatim} +The two boxes together have a height of \n{7.5pt}, +so the glue has to stretch~\n{1.5pt}. + +Next, we decrease the allowed depth of the resulting list. +\begin{verbatim} +\splitmaxdepth=2pt +\setbox1=\vbox{\High \vfil \HighAndDeep} +\setbox2=\vsplit1 to 9pt +\end{verbatim} +gives +\begin{verbatim} +> \box2= +\vbox(9.0+2.0)x0.4, glue set 1.0fil +.\hbox(5.0+0.0)x0.4 [] +.\glue 0.0 plus 1.0fil +.\glue(\lineskip) 0.0 +.\hbox(2.5+2.5)x0.4 [] +\end{verbatim} +The reference point is moved down half a point, +and the stretch is correspondingly diminished, +\alt +but this motion cannot lead to a larger dimension +than was specified. + +As an example of this, +\alt +consider the sequence \begin{verbatim} +\splitmaxdepth=3pt +\setbox1=\vbox{\High \kern1.5pt \HighAndDeep} +\setbox2=\vsplit1 to 9pt +\end{verbatim} +This gives a box exactly 9 points high and 2.5 points deep. +Setting \verb>\splitmaxdepth=2pt> does not increase +the height by half a point; instead, an underfull box +results because an earlier break is taken. + +Sometimes the timing of actions is important. +\TeX\ first locates a breakpoint that will lead +to the requested height, then checks whether accommodating +the \cs{maxdepth} or \cs{splitmaxdepth} will not +violate that height. + +Consider an example of this timing: +\alt +in +\begin{verbatim} +\splitmaxdepth=4pt +\setbox1=\vbox{\High \vfil \HighAndDeep} +\setbox2=\vsplit1 to 7pt +\end{verbatim} +the result is {\italic not\/} a box +of 7 points high and 3 points deep. Instead, +\begin{verbatim} +> \box2= +\vbox(7.0+0.0)x0.4 +.\hbox(5.0+0.0)x0.4 [] +\end{verbatim} +which is an underfull box. + +%\spoint[par:page:build] The page builder after a paragraph +\subsection{The page builder after a paragraph} +\label{par:page:build} + +After a paragraph, the page builder moves material +to the current page, but it does not decide whether a breakpoint +has been found yet. + +\begin{example}\begin{verbatim} +\output{\interrupt \plainoutput}% show when you're active +\def\nl{\hfil\break}\vsize=22pt % make pages of two lines +a\nl b\nl c\par \showlists % make a 3-line paragraph +\end{verbatim} +will report +\begin{verbatim} +### current page: +[...] +total height 34.0 + goal height 22.0 +prevdepth 0.0, prevgraf 3 lines +\end{verbatim} +Even though more than enough +material has been gathered, \cs{output} is only invoked +when the next paragraph starts: typing a \n d gives +\begin{verbatim} +! Undefined control sequence. +<output> {\interrupt + \plainoutput } +<to be read again> + d +\end{verbatim} +when \cs{output} is inserted after \cs{everypar}. +\end{example} + +%\subject[output] Output Routines +\endofchapter +\chapter{Output Routines}\label{output} + +The final stages of page processing are performed by the +output routine. The page builder cuts off a certain portion +of the main vertical list and hands it to the output routine +in \cs{box255}. This chapter treats the commands and parameters +that pertain to the output routine, and it explains how +output routines can receive information through marks. + +\begin{inventory} +\item [\cs{output}] + Token list with instructions for shipping out pages. + +\item [\cs{shipout}] + Ship a box to the \n{dvi} file. + + +\item [\cs{mark}] + Specify a mark text. + +\item [\cs{topmark}] + The last mark on the previous page. + +\item [\cs{botmark}] + The last mark on the current page. + +\item [\cs{firstmark}] + The first mark on the current page. + +\item [\cs{splitbotmark}] + The last mark on a split-off page. + +\item [\cs{splitfirstmark}] + The first mark on a split-off page. + +\item [\cs{deadcycles}] + Counter that keeps track of how many times + the output routine has been called without a \cs{shipout} + taking place. + +\item [\cs{maxdeadcycles}] + The maximum number of times that the output routine is allowed to + be called without a \cs{shipout} occurring. + +\item [\cs{outputpenalty}] + Value of the penalty at the current page break, + \alt + or $10\,000$ if the break was not at a penalty. + +\end{inventory} + + +%\point The \cs{output} token list +\section{The \protect\cs{output} token list} + +Common parlance has it that +`the output routine is called' when \TeX\ has found a place +to break the main vertical list. +Actually, \cs{output} is not a macro but a token list that +is inserted into \TeX's command stream. + +Insertion of the \cs{output} token list happens +\cstoidx output\par\term output routine\par +inside a group that is implicitly opened. +Also, \TeX\ enters internal vertical mode. +Because of the group, non-local assignments +(to the page number, for instance) +have to be prefixed with \cs{global}. +The vertical mode implies that during the workings of the +output routine +spaces are mostly harmless. + +The \cs{output} token list belongs +to the class of the +\gr{token parameter}s. These behave the same as +\cs{toks}$nnn$ token lists; see Chapter~\ref{token}. +Assigning an output routine can therefore take the following +forms: +\begin{disp}\cs{output}\gr{equals}\gr{general text}\quad +or\quad +\cs{output}\gr{equals}\gr{filler}\gr{token variable} +\end{disp} + + +%\point[output255] Output and \cs{box255} +\section{Output and \protect\cs{box255}} +\label{output255} + +\TeX's page builder breaks the current page at the optimal point, +and stores everything above that in \cs{box255}; +then, the \cs{output} tokens are inserted into the input stream. +Any remaining material on the main vertical list +is pushed back to the recent +contributions. +If the page is broken at a penalty, +\alt +that value is recorded in \cs{outputpenalty}, and +a penalty of size $10\,000$ is placed on top of the +recent contributions; otherwise, \cs{outputpenalty} +is set to~$10\,000$. +When the output routine is finished, \cs{box255} is +supposed to be empty. +If it is not, \TeX\ gives an error message. + +Usually, the output routine will take the pagebox, +\cstoidx shipout\par +\mdqon +append a headline and/""or footline, +\mdqoff +maybe merge in some insertions such as footnotes, +and ship the page to the \n{dvi} file: +\begin{verbatim} +\output={\setbox255=\vbox + {\someheadline + \vbox to \vsize{\unvbox255 \unvbox\footins} + \somefootline} + \shipout\box255} +\end{verbatim} +When box 255 reaches the output routine, its height has +been set to \cs{vsize}. +However, the material in it can have considerably +smaller height. +Thus, the above output routine may lead to underfull boxes. +This can be remedied with a \cs{vfil}. + +The output routine is under no obligation to +\cstoidx deadcycles\par +do anything useful with \cs{box255}; it can empty it, or +unbox it to let \TeX\ have another go at finding a page +break. The number of times +that the output routing postpones the \cs{shipout} +is recorded in \cs{deadcycles}: this parameter is set to~0 +by \cs{shipout}, and increased by~1 just before +every \cs{output}. + +When the number of dead cycles reaches +\csidx{maxdeadcycles}, \TeX\ gives an error message, +and performs the default output routine +\begin{verbatim} +\shipout\box255 +\end{verbatim} +instead of the routine it was about +to start. +The \LaTeX\ format has a much higher value for \cs{maxdeadcycles} +than plain \TeX, because the output routine in \LaTeX\ +is often called for +intermediate handling of floats and marginal notes. + +The \cs{shipout} command can send any \gr{box} to the \n{dvi} file; +this need not be box 255, or even a box +containing the current page. +It does not have to be called inside the output routine, either. + +If the output routine produces any material, for instance +by calling \begin{verbatim} +\unvbox255 +\end{verbatim} +this is put on top +of the recent contributions. + +After the output routine finishes, the page builder is +activated. In particular, because the current page +has been emptied, the \cs{vsize} is read again. +Changes made to this parameter inside the output +routine (using \cs{global}) will therefore take effect. + +%\point Marks +\section{Marks} + +Information can be passed to the output routine through the +\term marks\par\cstoidx mark\par +mechanism of `marks'. The user can specify a token list +with \begin{disp}\cs{mark}\lb\gr{mark text}\rb\end{disp} +which is put in a mark item on the current vertical list. +The mark text is subject to expansion as in \cs{edef}. + +If the mark is given in horizontal mode it migrates to +the surrounding vertical lists like an insertion item +(see page~\pageref{migrate}); +however, if this is not the external vertical list, the +output routine will not find the mark. + +Marks are the main mechanism through which the output routine +can obtain information about the contents of the currently +broken-off page, in particular its top and bottom. +\TeX\ sets three variables: +\begin{description} +\item [\csidx{botmark}] + the last mark occurring on the current page; +\item [\csidx{firstmark}] + the first mark occurring on the current page; +\item [\csidx{topmark}] + the last mark of the previous page, + that is, the value of \cs{botmark} + on the previous page. +\end{description} +If no marks have occurred yet, all three are empty; +if no marks occurred on the current page, +all three mark variables are equal +to the \cs{botmark} of the previous page. + +For boxes generated by a \cs{vsplit} command (see previous chapter), +the \cs{splitbotmark} and \cs{splitfirstmark} +\cstoidx splitbotmark\par\cstoidx splitfirstmark\par +contain the marks of the split-off part; \cs{firstmark} +and \cs{botmark} reflect the state of what remains in the register. + +\begin{example} Marks can be used to get a section heading into +\howto Do tricks with headlines\par +the headline or footline of the page. +\begin{verbatim} +\def\section#1{ ... \mark{#1} ... } +\def\rightheadline{\hbox to \hsize + {\headlinefont \botmark\hfil\pagenumber}} +\def\leftheadline{\hbox to \hsize + {\headlinefont \pagenumber\hfil\firstmark}} +\end{verbatim} +This places the title of the first section that starts on a +left page in the left headline, and the title of the last section +that starts on the right page in the right headline. +Placing the headlines on the page is the job of the output routine; +see below. + +It is important that no page breaks can occur in between the +mark and the box that places the title: +\begin{verbatim} +\def\section#1{ ... + \penalty\beforesectionpenalty + \mark{#1} + \hbox{ ... #1 ...} + \nobreak + \vskip\aftersectionskip + \noindent} +\end{verbatim} +\end{example} + +Let us consider +another example with headlines: often a page looks better if +the headline is omitted on pages where a chapter starts. +This can be implemented as follows: +\begin{verbatim} +\def\endofchapter +\chapter#1{ ... \def\chtitle{#1}\mark{1}\mark{0} ... } +\def\theheadline{\expandafter\ifx\firstmark1 + \else \chapheadline \fi} +\end{verbatim} +Only on the page where a chapter starts will the mark be~1, +and on all other pages a headline is placed. + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Hazards in non-trivial output routines +\subsection{Hazards in non-trivial output routines} + +If the final call to the output routine does not +perform a \cs{shipout}, \TeX\ will call the output +routine endlessly, since a run will only stop if both +the vertical list is empty, and \cs{deadcycles} +is zero. The output routine can set \cs{deadcycles} +to zero to prevent this. + +%\spoint Page numbering +\subsection{Page numbering} + +The page number is not an intrinsic property of the output +\term page numbering\par +routine; in plain \TeX\ it is the value of \cs{count0}. +The output routine is responsible for increasing the +page number when a shipout of a page occurs. + +Apart from \cs{count0}, counter registers~1--9 are also used +for page identification: at shipout \TeX\ writes the values +of these ten counters to the \n{dvi} file (see Chapter~\ref{TeXcomm}). +Terminal and log file output display only the non-zero counters, +and the zero counters for which a non-zero counter with +a higher number exists, that is, if \cs{count0}${}=1$ and +\cs{count3}${}=5$ are the only non-zero counters, the +displayed list of counters is~\n{[1.0.0.5]}. + +%\spoint Headlines and footlines in plain \TeX\ +\subsection{Headlines and footlines in plain \TeX} + +Plain \TeX\ has token lists \cs{headline} and +\cs{footline}; these are used in the macros +\cs{makeheadline} and \cs{makefootline}. +The page is shipped out as (more or less) +\begin{verbatim} +\vbox{\makeheadline\pagebody\makefootline} +\end{verbatim} + +Both headline and footline are inserted inside a \cs{line}. +For non-standard headers and footers it is easier to +redefine the macros \cs{makeheadline} and \cs{makefootline} +than to tinker with the token lists. + +%\spoint Example: no widow lines +\subsection{Example: no widow lines} + +Suppose that one does not want to allow widow lines, +but pages have in general no stretch or shrink, +for instance because they only contain plain text. +A~solution would be to increase the page length +by one line if a page turns out to be broken +at a widow line. + +\TeX's output routine can perform this sort of +trick: if the \cs{widowpenalty} is set to +some recognizable value, the output routine +can see by the \cs{outputpenalty} if a widow +line occurred. In that case, the output routine +can temporarily increase the \cs{vsize}, and +let the page builder have another go at +finding a break point. + +Here is the skeleton of such an output routine. +No headers or footers are provided for. +\begin{verbatim} +\newif\ifLargePage \widowpenalty=147 +\newdimen\oldvsize \oldvsize=\vsize +\output={ + \ifLargePage \shipout\box255 + \global\LargePagefalse + \global\vsize=\oldvsize + \else \ifnum \outputpenalty=\widowpenalty + \global\LargePagetrue + \global\advance\vsize\baselineskip + \unvbox255 \penalty\outputpenalty + \else \shipout\box255 + \fi \fi} +\end{verbatim} +The test \cs{ifLargePage} is set to true by the +output routine if the \cs{outputpenalty} +equals the \cs{widowpenalty}. The page box +is then \cs{unvbox}$\,$ed, so that the page builder +will tackle the same material once more. + +%\spoint Example: no indentation top of page +\subsection{Example: no indentation top of page} + +Some output routines can be classified +\howto Prevent indentation on top of page\par +as abuse of the output routine mechanism. +The output routine in this section is a good example of this. + +It is imaginable that one wishes paragraphs not to indent +if they start at the top of a page. (There are plenty of objections +to this layout, but occasionally it is used.) +This problem can be solved using the output routine to +investigate whether the page is still empty and, if so, +to give a signal that a paragraph should not indent. + +Note that we cannot use the fact here +that the page builder comes into play after +the insertion of \cs{everypar}: even if we could +force the output routine to be activated here, +there is no way for it to remove the indentation box. + +The solution given here lets the \cs{everypar} +terminate the paragraph immediately +with \begin{verbatim} +\par\penalty-\specialpenalty +\end{verbatim} +which activates the output routine. +Seeing whether the pagebox is empty (after removing +the empty line and any \cs{parskip} glue), +the output routine then can set a switch +signalling whether the retry of the paragraph +should indent. + +There are some minor matters in the following +routines, the sense of which is left +for the reader to ponder. +\begin{verbatim} +\mathchardef\specialpenalty=10001 +\newif\ifPreventSwitch +\newbox\testbox +\topskip=10pt + +\everypar{\begingroup \par + \penalty-\specialpenalty + \everypar{\endgroup}\parskip0pt + \ifPreventSwitch \noindent \else \indent \fi + \global\PreventSwitchfalse + } +\output{ + \ifnum\outputpenalty=-\specialpenalty + \setbox\testbox\vbox{\unvbox255 + {\setbox0=\lastbox}\unskip} + \ifdim\ht\testbox=0pt \global\PreventSwitchtrue + \else \topskip=0pt \unvbox\testbox \fi + \else \shipout\box255 \global\advance\pageno1 \fi} +\end{verbatim} + + +%\spoint More examples of output routines +\subsection{More examples of output routines} + +A large number of examples of output routines +can be found in~\cite{Sal1} and~\cite{Sal2}. + +%\subject[insert] Insertions +\endofchapter +\chapter{Insertions}\label{insert} + +Insertions are \TeX's way of handling floating information. +\TeX's page builder calculates what insertions and how many +of them will fit on the page; these insertion items are then +placed in insertion boxes which are to be handled by the +output routine. + + + +\begin{inventory} +\item [\cs{insert}] + Start an insertion item. + +\item [\cs{newinsert}] + Allocate a new insertion class. + +\item [\cs{insertpenalties}] + Total of penalties for split insertions. + Inside the output routine, the number of held-over insertions. + +\item [\cs{floatingpenalty}] + Penalty added when an insertion is split. + +\item [\cs{holdinginserts}] + (\TeX3 only) + If this is positive, insertions are not placed in their boxes + at output time. + +\item [\cs{footins}] + Number of the footnote insertion class in plain \TeX. + +\item [\cs{topins}] + Number of the top insertion class. + +\item [\cs{topinsert}] + Plain \TeX\ macro to start a top insert. + +\item [\cs{pageinsert}] + Plain \TeX\ macro to start an insert that will take + up a whole page. + +\item [\cs{midinsert}] + Plain \TeX\ macro that places its argument if there is space, + and converts it into a top insert otherwise. + +\item [\cs{endinsert}] + Plain \TeX\ macro to wind up an insertion item + that started with \cs{topinsert}, \cs{midinsert}, + or \cs{pageinsert}. + +\end{inventory} + + +%\point Insertion items +\section{Insertion items} + +Insertions contain floating information. +\term insertions\par +Handling insertions is a strange interplay between the +user, \TeX's internal workings, and the output routine. +First the user specifies an insertion, which is +a certain amount of vertical material; +then \TeX's page builder decides what insertions should go +on the current page and puts these insertions in insertion boxes; +finally, the output routine has to do something with these boxes. + +An insertion item looks like +\cstoidx insert\par +\begin{disp}\cs{insert}\gr{8-bit number}\lb\gr{vertical mode material}\rb +\end{disp} where the 8-bit number should not be~255, +because \cs{box255} is used by \TeX\ for passing the page to the output +routine. + +The braces around the vertical mode material in an insertion +item can be implicit; they imply a new level of grouping. +The vertical mode material is processed in internal +vertical mode. + +Values of \cs{splittopskip}, \cs{splitmaxdepth}, +and \cs{floatingpenalty} are relevant for split insertions +(see below); the values that are current just before +the end of the group are used. + +Insertion items can appear in vertical mode, horizontal +mode, and math mode. For the latter two modes they have to +migrate to the surrounding vertical list +(see page~\pageref{migrate}). +After an insertion item is put on the vertical list the +page builder is exercised. + + +%\point Insertion class declaration +\section{Insertion class declaration} + +In the plain format +the number for a new insertion class +is allocated by \csidx{newinsert}: +\begin{verbatim} +\newinsert\myinsert % new insertion class +\end{verbatim} +which uses \cs{chardef} to assign a number to the control +sequence. + +Insertion classes are allocated numbering from 254 downward. +As box~255 is used for output, this allocation scheme leaves +\cs{skip255}, \cs{dimen255}, and \cs{count255} +free for scratch use. + +%\point Insertion parameters +\section{Insertion parameters} + +For each insertion class~$n$ four registers are allocated: +\begin{itemize} +\item \cs{box}$\,n$ When the output routine is active this + box contains the insertion items of class~$n$ that should + be placed on the current page. +\item \cs{dimen}$\,n$ This is the maximum space allotted for + insertions of class~$n$ per page. If this amount would + be exceeded \TeX\ will split insertions. +\item \cs{skip}$\,n$ Glue of this size is added the first + time an insertion item of class~$n$ is added to the + current page. This is useful for such phenomena as a rule + separating the footnotes from the text of the page. +\item \cs{count}$\,n$ Each insertion item is a vertical list, + so it has a certain height. However, the effective height, + the amount of influence it has on the text height of the + page, may differ from this real height. + The value of \cs{count}$\,n$ + is then 1000 times the factor by which the height should + be multiplied to obtain the effective height. + + Consider the following examples: + \begin{itemize}\item Marginal notes do not affect + the text height, so the factor should be~0. \item Footnotes + set in double column mode affect the page by half of their height: + the count value should by~500. \item Conversely, footnotes + set at page width underneath a page in double column mode + affect both columns, so \ldash provided that the double column mode + is implemented by applying \cs{vsplit} to a double-height column \rdash + the count value should be~2000.\end{itemize} +\end{itemize} + +%\point Moving insertion items from the contributions list +\section{Moving insertion items from the contributions list} + +The most complicated issue with insertions is the algorithm +that adds insertion items to the main vertical list, +and calculates breakpoints if necessary. + +\TeX\ never changes the \cs{vsize}, but it diminishes the +\csidx{pagegoal} by the (effective) heights of the insertion +items that will appear before a page break. Thus the output +routine will receive a \cs{box255} that has height \cs{pagegoal}, +not necessarily \cs{vsize}. + +\begin{enumerate} +\item When the first insertion of a certain class $n$ occurs + on the current page \TeX\ has to account for the quantity + \cs{skip}$\,n$. This step is executed only if no earlier + insertion item of this class occurs on the vertical list + \ldash this includes insertions that were split \rdash but \cs{box}$\,n$ + need not be empty at this time. + + If \cs{box}$\,n$ is not empty, its height plus depth is multiplied + by \cs{count}$\,n/1000$ and the result is subtracted + from \cs{pagegoal}. Then the \cs{pagegoal} is diminished + by the natural component of \cs{skip}$\,n$. Any stretch and + shrink of \cs{skip}$\,n$ are incorporated in \cs{pagestretch} + and \cs{pageshrink} respectively. +\item If there is a split insertion of class $n$ on the page + \ldash this case and the previous step in the algorithm are + mutually exclusive \rdash the \csidx{floatingpenalty} is added to + \csidx{insertpenalties}. A~split insertion is an insertion item + for which a breakpoint has been calculated as it will not + fit on the current page in its entirety. Thus the insertion + currently under consideration will certainly not wind up + on the current page. +\item After the preliminary action of the two previous points + \TeX\ will place the actual insertion item on the main vertical + list, at the end of the current contributions. + First it will check whether the item will fit without being split. + + There are two conditions to be checked:\begin{itemize}\item + adding the insertion item (plus all previous insertions of that class) + to \cs{box}$\,n$ should not let + the height plus depth of that box exceed \cs{dimen}$\,n$, and + \item either the effective height of the insertion is negative, or + \cs{pagetotal} plus \cs{pagedepth} minus \cs{pageshrink} + plus the effective size of the insertion should be less than + \cs{pagegoal}.\end{itemize} + If these conditions are satisfied, \cs{pagegoal} is diminished + by the effective size of the insertion item, that is, + by the height plus depth, multiplied by \cs{count}$n/1000$. + +\item Insertions that fail on one of the two conditions in the + previous step of the algorithm will be considered for splitting. + \TeX\ will calculate the size of the maximal portion to + be split off the insertion item, such that + \begin{enumerate}\item adding this portion + together with earlier insertions of this class to \cs{box}$\,n$ + will not let the size of the box exceed \cs{dimen}$\,n$, + and \item the effective size of this portion, + added to \cs{pagetotal} plus \cs{pagedepth}, will not + exceed \cs{pagegoal}. Note that \cs{pageshrink} is not taken + into account this time, as it was in the previous step. + \end{enumerate} + + Once this maximal size to be split off has been determined, + \TeX\ locates the least-cost breakpoint in the current + insertion item that will result in a box with a height + that is equal to this maximal size. The penalty associated + with this breakpoint is added to \cs{insertpenalties}, + and \cs{pagegoal} is diminished by the effective height plus + depth of the box to be split off the insertion item. + +\end{enumerate} + + + +%\point Insertions in the output routine +\section{Insertions in the output routine} + +When the output routine comes into action \ldash more precisely: +when \TeX\ starts processing the tokens in the \cs{output} +token list \rdash all insertions that should be placed on the +current page have been put in their boxes, and +it is the responsibility of the output routine +to put them somewhere in the box that is going to be shipped out. + +\begin{example} The plain \TeX\ output routine +handles top inserts and footnotes by packaging the following +sequence: +\begin{verbatim} +\ifvoid\topins \else \unvbox\topins \fi +\pagebody +\ifvoid\footins \else \unvbox\footins \fi +\end{verbatim} +Unboxing the insertion boxes makes the glue on various parts +of the page stretch or shrink in a uniform manner. +\end{example} + +With \TeX3 the insertion mechanism has been extended slightly: +\cstoidx holdinginserts\par\term \TeX\ version 3\par +the parameter \cs{holdinginserts} can be used to specify that +insertions should not yet be placed in their boxes. +This is very useful if the output routine wants to +recalculate the \cs{vsize}, or if the output routine +is called to do other intermediate calculations instead of +ejecting a page. + +During the output routine the parameter +\csidx{insertpenalties} holds the number of insertion items that +are being held over for the next page. +In the plain \TeX\ output routine this is used after the +last page:\begin{verbatim} +\def\dosupereject{\ifnum\insertpenalties>0 + % something is being held over + \line{}\kern-\topskip\nobreak\vfill\supereject\fi} +\end{verbatim} + +%\point Plain \TeX\ insertions +\section{Plain \TeX\ insertions} + +The plain \TeX\ format has only two insertion classes: +the footnotes and the top inserts. +The macro \csidx{pageinsert} generates +top inserts that are stretched to be exactly \cs{vsize} high. +The \csidx{midinsert} macro tests whether the vertical material +specified by the user fits on the page; if so, it is placed +there; if not, it is converted to a top insert. + +Footnotes are allowed to be split, but once one has been +split no further footnotes should appear on the current +page. This effect is attained by setting +\begin{verbatim} +\floatingpenalty=20000 +\end{verbatim} +The \cs{floatingpenalty} is added to \cs{insertpenalties} +if an insertion follows a split insertion of the same +class. However, \cs{floatingpenalty}${}>10\,000$ has infinite +cost, so \TeX\ will take an earlier breakpoint for +splitting off the page from the vertical list. + +Top inserts essentially contain only a vertical box +which holds whatever the user specified. Thus such an insert +cannot be split. However, the \csidx{endinsert} macro +puts a \cs{penalty100} on top of the box, so the +insertion can be split with an empty part before the split. +The effect is that the whole insertion is carried over to +the next page. As the \cs{floatingpenalty} for top inserts +is zero, arbitrarily many of these inserts can be moved forward +until there is a page with sufficient space. + +Further examples of insertion macros can be found +in~\cite{Sal3}. + +%\message{Maybe spaceleft example?} + +%%%% end of input file [page] + +%\InputFile:io +%%%% this is input file [io] +%\subject[io] File Input and Output +\endofchapter +\chapter{File Input and Output}\label{io} + +This chapter treats the various ways in which \TeX\ can read from +\mdqon +\term I/""O\par +\mdqoff +and write to external files. + +\begin{inventory} +\item [\cs{input}] + Read a specified file as \TeX\ input. + +\item [\cs{endinput}] + Terminate inputting the current file after the current line. + +\item [\cs{pausing}] + Specify that \TeX\ should pause after each line that is + read from a file. + +\item [\cs{inputlineno}] + Number of the current input line. + + +\item [\cs{write}] + Write a \gr{general text} to the terminal or to a file. + +\item [\cs{read}] + Read a line from a stream into a control sequence. + +\item [\cs{newread \cs{newwrite}}] +\mdqon + Macro for allocating a new input/""output stream. +\mdqoff + +\item [\cs{openin \cs{closein}}] + Open/close an input stream. + +\item [\cs{openout \cs{closeout}}] + Open/close an output stream. + +\item [\cs{ifeof}] + Test whether a file has been fully read, or does not exist. + +\item [\cs{immediate}] + Prefix to have output operations executed right away. + +\item [\cs{escapechar}] + Number of the character that is used + when control sequences are being converted + into character tokens. + \IniTeX\ default:~92. + +\item [\cs{newlinechar}] + Number of the character that triggers a new line in + \cs{write} statements. + +\end{inventory} + + +%\point Including files: \cs{input} and \cs{endinput} +\section{Including files: \protect\cs{input} and \protect\cs{endinput}} + +Large documents can be segmented in \TeX\ by putting +\term input files\par\cstoidx input\par +parts in separate files, and loading these with \cs{input} +into the master file. The exact syntax for +file names is implementation dependent; most of the +time a \n{.tex} file extension is assumed if no explicit +extension is given. +File names can be delimited with a space or with \cs{relax}. +The \cs{input} command is expandable. + +If \TeX\ encounters in an input file the +\csidx{endinput} statement, it acts as if the file +ends after the line on which the statement occurs. +Any statements on the same line as \cs{endinput} are +still executed. +The \cs{endinput} statement is expandable. + +%\point File I{/}O +\section{File I{/}O} + +\TeX\ supports input and output streams for reading and writing +\altt +files one line at a time. + +%\spoint Opening and closing streams +\subsection{Opening and closing streams} + +\TeX\ supports up to 16 simultaneous input and 16 output streams. +\term streams\par +The plain \TeX\ macros +\csidx{newread} and \csidx{newwrite} give the number of an unused +stream. This number is assigned by a \cs{chardef} command. +Input streams are completely independent of output +streams. + +Input streams are opened by +\cstoidx openin\par +\begin{disp}\cs{openin}\gr{4-bit number}\gr{equals}\gr{filename}\end{disp} +and closed by +\cstoidx closein\par +\begin{disp}\cs{closein}\gr{4-bit number}\end{disp} + +Output streams are opened by +\cstoidx openout\par +\begin{disp}\cs{openout}\gr{4-bit number}\gr{equals}\gr{filename}\end{disp} +and closed by +\cstoidx closeout\par +\begin{disp}\cs{closeout}\gr{4-bit number}\end{disp} + +If an output file does not yet exist, it is created +by \cs{openout}; if it did exist, an \cs{openout} will +cause it to be overwritten. + +The output operations \cs{openout}, \cs{closeout}, +and \cs{write} can all three be prefixed by \cs{immediate}; +see below. + +%\spoint Input with \cs{read} +\subsection{Input with \cs{read}} + +In addition to the \cs{input} command, which reads a whole +file, \TeX\ has the \csidx{read} operation, which +reads one line from a file (or from the user terminal). +The syntax of the read command is + \begin{disp}\cs{read}\gr{number}\n{to}\gr{control sequence}\end{disp} +The effect of this statement is that one input line +is read from the designated stream, and the control +sequence is defined as a macro without parameters, having +that line as replacement text. + +If the input line is not balanced with respect to braces, +\TeX\ will read more than one line, continuing for as long +as is necessary to get a balanced token list. +\TeX\ implicitly appends an empty line to each input stream, +\alt +so the last \cs{read} operation on a stream will always +yield a single \cs{par} token. + +Read operations from any stream outside the range 0--15 \ldash or +streams not associated with an open file, or on which the file +end has been reached \rdash +read from the terminal. If the stream number is positive +the user is prompted with the name of the control sequence +being defined by the \cs{read} statement. + +\begin{example}\begin{verbatim} +\read16 to \data +\end{verbatim} +displays a prompt \begin{verbatim} +\data= +\end{verbatim} +and typing `my name' +in response makes the read statement equivalent +to \begin{verbatim} +\def\data{my name } +\end{verbatim} +The space at the end of the input derives from the line end; +to prevent this one could write +\begin{verbatim} +{\endlinechar=-1 \global\read16 to \data} +\end{verbatim} +\end{example} + +%\spoint Output with \cs{write} +\subsection{Output with \cs{write}} + +\TeX's \csidx{write} command + \begin{disp}\cs{write}\gr{number}\gr{general text}\end{disp} +writes a balanced token list to a file which has been opened +by \cs{openout}, to the log file, or to the terminal. + +Write operations to a stream outside 0--15 \ldash or to a +stream that is not associated with an open file \rdash go to the log file; +if the stream number is positive they +go to the terminal as well as to the log file. + +The token list argument of \cs{write}, defined as + \begin{disp}\gr{general text} $\longrightarrow$ \gr{filler}% + \lb\gr{balanced text}\gr{right brace}\end{disp} +can have an implicit opening brace. +This argument is expanded as if it were the replacement +text of an \cs{edef}, so, for instance, +any macros and conditionals appearing are expanded. +No commands are executed, however. +This expansion occurs +at the time of shipping out; see below. +Until that time the argument token list is stored +in a whatsit item on the current list. +See further Chapter~\ref{expand} for +a discussion of expansion during writing. + +A control sequence output by \cs{write} (or \cs{message}) +is represented with a trailing space, and using +character number \cs{escapechar} +for the escape character. +The \IniTeX\ default for this is~92, +the code for the backslash. +The trailing space can be prevented by prefixing the control +sequence with \cs{string}. + +%\point Whatsits +\section{Whatsits} + +There is an essential difference +\term whatsits\par +in execution between input and output: +operations concerning output +(\cs{openout}, \cs{closeout}, \cs{write}) +are not executed immediately; instead, they are saved until +the box in which they appear is shipped out +to the \n{dvi} file. + +Writes and the other two output operations are placed +in `whatsit' items on whichever list is currently being built. +The actual operation occurs when the part of the page +that has the item is shipped out to the \n{dvi} file. +This delayed output is made necessary by \TeX's +asynchronous output routine behaviour. +See a worked-out example on page~\pageref{expand:write}. + +An \verb.\immediate\write. \ldash or any other \csidx{immediate} output +operation \rdash is executed on the spot, and +does not place a whatsit item on the current list. + +The argument of a \cs{special} command +(see page~\pageref{special}) is also placed in a whatsit. + +Whatsit items in leader boxes are ignored. + +%\point Assorted remarks +\section{Assorted remarks} + +%\spoint Inspecting input +\subsection{Inspecting input} + +\TeX\ records the current line number in the current input file +in the \gr{internal integer} parameter \csidx{inputlineno} +(in \TeX3). + +If the parameter \csidx{pausing} is positive, \TeX\ shows +every line that is input on the terminal screen, +and gives the user the opportunity +to insert commands. These can for instance be \cs{show} commands. +Inserted commands are treated as if they were directly +in the source file: it is for instance not necessary +to prefix them with~`i', as would be necessary when +\TeX\ pauses for an error. + +%\spoint Testing for existence of files +\subsection{Testing for existence of files} + +\TeX\ is not the friendliest of systems when you +\howto Test whether a file exists\par +ask it to input a non-existing file. Therefore the following +sequence of commands can be used to prevent trouble\label{ex:eof}: +\begin{verbatim} +\newread\instream \openin\instream= fname.tex +\ifeof\instream \message{File 'fname' does not exist!} +\else \closein\instream \input fname.tex +\fi +\end{verbatim} +Here an input stream is opened with the given file name. +The end-of-file test is also true +if an input stream does not correspond to a physical file, +so if this conditional is not true, +the file exists and an \cs{input} command can safely be given. + +%\spoint Timing problems +\subsection{Timing problems} + +The synchronization between write operations on the +one hand, and opening/closing operations +of files on the other hand, +can be a crucial point. Auxiliary files, such as are +used by various formats to implement cross-references, +are a good illustration of this. + +Suppose that during a run of \TeX\ the auxiliary file is written, and +\howto Input a file that was created in the same run of \TeX\par +at the end of the run it has to be input again for a variety +of purposes (such as seeing whether references have changed). +An \cs{input} command is executed right away, so +the file must have been closed with an \verb=\immediate\closeout=. +However, now it becomes possible that the file is closed +before all writes to it have been performed. +The following sequence remedies this: +\begin{verbatim} +\par\vfil\penalty -10000 \immediate\closeout\auxfile +\end{verbatim} +The first three commands activate the output routine +in order to close off the last page, +so all writes will indeed have been performed before the +file is closed. + +%\spoint \cs{message} versus \cs{immediate}\cs{write}16 +\subsection{\cs{message} versus \cs{immediate}\cs{write}16} + +Messages to the user can be given using +\csidx{message}\gr{general text}, which writes to the terminal. +Messages are appended to one another; +the line is wrapped when the line +length (a~\TeX\ compile-time constant) has been reached. +In \TeX\ version2, +a~maximum of 1000 characters is written per message; +this is not a compile-time constant, but is hard-wired +into the \TeX\ program. + +Each message given with \verb=\immediate\write= +starts on a new line; the user can force a new line +in the message by including the character with +number~\csidx{newlinechar}. This parameter also works +in \cs{message}. + +%\spoint Write inside a vertical box +\subsection{Write inside a vertical box} + +Since a write operation winds up on the vertical list in a whatsit, +issuing one at the start of a \cs{vtop} +will probably influence the height of that box +(see Chapter~\ref{boxes}). As an example, +\begin{verbatim} +have the \vtop{\write\terminal{Hello!}\hbox{more text}} +dangling from +\end{verbatim} +will have the~\vtop{\write-1{vtop gezien}\hbox{more text}}~dangling +from the baseline (and when this book is \TeX ed the +message `Hello!' appears on the screen). + +%\spoint Expansion and spaces in \cs{write} and \cs{message} +\subsection{Expansion and spaces in \cs{write} and \cs{message}} + +Both \cs{write} and \cs{message} expand their argument +as if it were the replacement text of an \cs{edef}. +Therefore \begin{verbatim} +\def\a{b}\message{\a} +\end{verbatim} +will +write out~`\n b'. + +Unexpandable control sequences are displayed with a trailing +space (and prefixed with the \cs{escapechar}): +\begin{verbatim} +\message{\hbox\vbox!} +\end{verbatim} +will write out +`\verb>\hbox \vbox !>'. Undefined control sequences give an error here. + +Expandable control sequences can be written out with some +care:\begin{verbatim} +\message{\noexpand\ifx} +\message{\string\ifx} +{\let\ifx\relax \message{\ifx}} +\end{verbatim} +all write out `\verb>\ifx>'. + +Note, however, that spaces after expandable control sequences +are removed in the input processor, which goes into state~$S$ +after a control sequence. Therefore +\begin{verbatim} +\def\a{b}\def\c{d} +\message{\a \c} +\end{verbatim} +writes out `\n{bd}'. +Inserting a space can be done as follows: +\begin{verbatim} +\def\space{ } % in plain TeX +\message{\a\space\c} +\end{verbatim} +displays `\n{b d}'. +Note that\begin{verbatim} + +\message{\a{ }\c} +\end{verbatim} +does not work: it displays `\verb=b{ }d=' +since braces are unexpandable character tokens. + +%%%% end of input file [io] + +%\InputFile:alloc +%%%% this is input file [alloc] +%\subject[alloc] Allocation +\endofchapter +\chapter{Allocation}\label{alloc} + +\TeX\ has registers of a number of types. For some of these, +explicit commands exist to define a synonym for a certain register; +for all of them macros exist in the plain format +to allocate an unused register. This chapter treats +the synonym and allocation commands, and discusses +some guidelines for macro writers regarding allocation. + +\begin{inventory} +\item [\cs{countdef}] + Define a synonym for a \cs{count} register. +\item [\cs{dimendef}] + Define a synonym for a \cs{dimen} register. +\item [\cs{muskipdef}] + Define a synonym for a \cs{muskip} register. +\item [\cs{skipdef}] + Define a synonym for a \cs{skip} register. +\item [\cs{toksdef}] + Define a synonym for a \cs{toks} register. +\item [\cs{newbox}] + Allocate an unused \cs{box} register. +\item [\cs{newcount}] + Allocate an unused \cs{count} register. +\item [\cs{newdimen}] + Allocate an unused \cs{dimen} register. +\item [\cs{newfam}] + Allocate an unused math family. +\item [\cs{newinsert}] + Allocate an unused insertion class. +\item [\cs{newlanguage}] + (\TeX3 only) + Allocate a new language number. +\item [\cs{newmuskip}] + Allocate an unused \cs{muskip} register. +\item [\cs{newskip}] + Allocate an unused \cs{skip} register. +\item [\cs{newtoks}] + Allocate an unused \cs{toks} register. +\item [\cs{newread}] + Allocate an unused input stream. +\item [\cs{newwrite}] + Allocate an unused output stream. +\end{inventory} + +%\point Allocation commands +\section{Allocation commands} + +In plain \TeX, \cs{new...} macros are defined for +allocation of registers. +The registers of \TeX\ fall into two classes that are +\term registers, allocation of\par +allocated in different ways. This is treated below. + +The \csidx{newlanguage} macro of plain \TeX\ +does not allocate any register. Instead it merely assigns +a number, starting from~0. +\TeX\ (version~3) can have at most 256 different +sets of hyphenation patterns. + +The \cs{new...} macros of plain \TeX\ are defined to be +\cs{outer} (see Chapter~\ref{macro} for a precise explanation), +which precludes use of the allocation macros in other macros. +Therefore the \LaTeX\ format redefines these macros +without the \cs{outer} prefix. + +%\spoint \cs{count}, \cs{dimen}, \cs{skip}, \cs{muskip}, \cs{toks} +\subsection{\cs{count}, \cs{dimen}, \cs{skip}, \cs{muskip}, \cs{toks}} + +For these registers there exists a \gr{registerdef} command, +for instance \cs{countdef}, to couple a specific register +to a control sequence: +\begin{Disp}\gr{registerdef}\gr{control + sequence}\gr{equals}\gr{8-bit number}\end{Disp} + +After the definition \begin{verbatim} +\countdef\MyCount=42 +\end{verbatim} +the allocated register can be used as +\begin{verbatim} +\MyCount=314 +\end{verbatim} +or \begin{verbatim} +\vskip\MyCount\baselineskip +\end{verbatim} + +The \gr{registerdef} commands are used in plain \TeX\ macros +\cs{newcount} et cetera that allocate an unused register; +after\begin{verbatim} +\newcount\MyCount +\end{verbatim} +\cs{MyCount} can be used +exactly as in the above two examples. + +%\spoint \cs{box}, \cs{fam}, \cs{write}, \cs{read}, \cs{insert} +\subsection{\cs{box}, \cs{fam}, \cs{write}, \cs{read}, \cs{insert}} + +For these registers there exists no \gr{registerdef} command in \TeX, +so \cs{chardef} is used to allocate box registers +in the corresponding plain \TeX\ macros \cs{newbox}, for instance. + +The fact that \cs{chardef} is used implies that the +defined control sequence does not stand for the register itself, +but only for its number. Thus after \begin{verbatim} +\newbox\MyBox +\end{verbatim} +it is necessary to write \begin{verbatim} +\box\MyBox +\end{verbatim} +Leaving out the \cs{box} means that the character +in the current font with number +\cs{MyBox} is typeset. The \cs{chardef} command +is treated further in Chapter~\ref{char}. + +%\point Ground rules for macro writers +\section{Ground rules for macro writers} + +The \cs{new...} macros of plain \TeX\ have been designed +to form a foundation for macro packages, such that +several of such packages can operate without collisions +in the same run of \TeX. In appendix~B of \TeXbook\ +Knuth formulates some ground rules that macro writers should +adhere to. +\begin{enumerate} +\item The \cs{new...} macros do not allocate registers +with numbers~0--9. These can therefore be used as `scratch' +registers. However, as any macro family can use them, +no assumption can be made about the permanency of their +contents. Results that are to be passed from one call to +another should reside in specifically allocated registers. + +Note that count registers 0--9 are used for page identification +in the \n{dvi} file (see Chapter~\ref{TeXcomm}), so no global assignments +to these should be made. + +\item \cs{count255}, \cs{dimen255}, and \cs{skip255} are +also available. This is because inserts are +allocated from 254 downward and, together with an insertion box, +a count, dimen, and skip register, +all with the same number, are allocated. +Since \cs{box255} is used by the output routine +(see Chapter~\ref{output}), +the count, dimen, and skip with number~255 are freely available. + +\item Assignments to scratch registers~0, 2, 4, 6, 8, and~255 +should be local; assignments to registers~1, 3, 5, 7,~9 +should be \cs{global} (with the exception of the \cs{count} +registers). This guideline prevents `save +stack build-up' (see Chapter~\ref{error}). + +\item Any register can be used inside a group, as \TeX's +grouping mechanism will restore its value outside +the group. There are two conditions on this use of +a register: +no global assignments should be made to it, and +it must not be possible that other macros may be +activated in that group that perform global assignments +to that register. + +\item Registers that are used over longer periods of time, +or that have to survive in between calls of different +macros, should be allocated by \cs{new...}. +\end{enumerate} + + +%%%% end of input file [alloc] + +%\InputFile:run +%%%% this is input file [run] +%\subject[run] Running \TeX +\endofchapter +\chapter{Running \TeX}\label{run} + +This chapter treats the run modes of \TeX, and some +other commands associated with the job being processed. + +\begin{inventory} +\item [\cs{everyjob}] + Token list that is inserted at the start of each new job. + +\item [\cs{jobname}] + Name of the main \TeX\ file being processed. + +\item [\cs{end}] + Command to finish off a run of \TeX. + +\item [\cs{bye}] + Plain \TeX\ macro to force the final output. + +\item [\cs{pausing}] + Specify that \TeX\ should pause after each line that is + read from a file. + +\item [\cs{errorstopmode}] + \TeX\ will ask for user input on the occurrence of an error. + +\item [\cs{scrollmode}] + \TeX\ fixes errors itself, + but will ask the user for missing files. + +\item [\cs{nonstopmode}] + \TeX\ fixes errors itself, + and performs an emergency stop on serious errors + such as missing input files. + +\item [\cs{batchmode}] + \TeX\ fixes errors itself + and performs an emergency stop on serious errors + such as missing input files, + but no terminal output is generated. + +\end{inventory} + +%\point Jobs +\section{Jobs} + +\TeX\ associates with each run a name for the file +\term job\par +being processed: the \csidx{jobname}. If \TeX\ is run +interactively +\ldash meaning that it has been invoked without a file argument, +and the user types commands \rdash +the jobname is \n{texput}. + +The \cs{jobname} can be used to generate +the names of auxiliary files to be read or +written during the run. For instance, for a file \n{story.tex} +the \cs{jobname} is \n{story}, and writing +\begin{verbatim} +\openout\Auxiliary=\jobname.aux +\openout\TableOfContents=\jobname.toc +\end{verbatim} +will create the files \n{story.aux} and \n{story.toc}. + +%\spoint Start of the job +\subsection{Start of the job} + +\TeX\ starts each job by inserting the \csidx{everyjob} token +list into the command stream. +Setting this variable during a run of \TeX\ has no use, +but a format can use it to identify itself to the user. +If a +format fills the token list, the commands therein are automatically +executed when \TeX\ is run using that format. + +%\spoint End of the job +\subsection{End of the job} + +A \TeX\ job is terminated by the \csidx{end} command. This +may involve first forcing the output routine to process any +remaining material (see Chapter~\ref{page:break}). +If the end of job occurs inside a group +\TeX\ will give a diagnostic +message. The \cs{end} command is not allowed in internal +vertical mode, because this would be inside a vertical box. + +Usually some sugar coating of the \cs{end} command is necessary. +For instance the plain \TeX\ macro \csidx{bye} is defined +as \begin{verbatim} +\def\bye{\par\vfill\supereject\end} +\end{verbatim} +where the \cs{supereject} takes care of any leftover insertions. + +%\spoint The log file +\subsection{The log file} + +For each run \TeX\ creates a log file. Usually this will be +\term log file\par +a file with as name the value of \cs{jobname}, and the +extension \n{.log}. Other extensions such as \n{.lis} +are used by some implementations. +This log file contains all information that +is displayed on the screen during the run of \TeX, but +it will display some information more elaborately, and it +can contain statistics that are usually not displayed on +the screen. If the parameter \cs{tracingonline} +has a positive value, all the log file information will be +shown on the screen. + +Overfull and underfull boxes are reported on the terminal +screen, and they are dumped using the parameters +\cs{showboxdepth} and \cs{showboxbreadth} in the log file +(see Chapter~\ref{trace}). These parameters are also used +for box dumps caused by the \cs{showbox} command, and +for the dump of boxes written by \cs{shipout} +if \cs{tracingoutput} is set to a positive value. + +Statistics generated by commands such as \cs{tracingparagraphs} +will be written to the log file; if \cs{tracingonline} is positive +they will also be shown on the screen. + +Output operations to a stream that is not open, or to a +stream with a number that is not in the range 0--15, +go to the log file. If the stream number is positive, +they also go to the terminal. + +%\point Run modes +\section{Run modes} + +By default, \TeX\ goes into \cs{errorstopmode} if an error occurs: +\term run modes\par\cstoidx errorstopmode\par +it stops and asks for input from the user. Some implementations + have a way of forcing \TeX\ into errorstopmode +when the user interrupts \TeX, so that +the internal state of \TeX\ can be inspected (and altered). +See page~\pageref{interaction} for ways to switch the run +mode when \TeX\ has been interrupted. + +Often, \TeX\ can +fix an error itself if the user asks \TeX\ just to continue +(usually by hitting the return key), +but sometimes (for instance in alignments) +it may take a while before \TeX\ is on the +right track again (and sometimes it never is). +In such cases the user may want to +turn on \csidx{scrollmode}, +which instructs \TeX\ to fix as best it can any +occurring error without confirmation from the user. +This is usually done by typing `s' when \TeX\ asks +for input. + +In \cs{scrollmode}, \TeX\ also does not ask for input +after \cs{show...} commands. +\alt +However, some errors, such as a file that could not be +found for \cs{input}, are not so easily remedied, so +the user will still be asked for input. + +With \csidx{nonstopmode} \TeX\ will scroll through errors and, +in the case of the kind of error that cannot be recovered from, +it will make an emergency stop, aborting the run. +Also \TeX\ will abort the run if a \cs{read} is attempted +from the terminal. +The \csidx{batchmode} differs only from nonstopmode in that +it gives messages only to the log file, not to the terminal. + +\endofchapter +\chapter{\TeX\ and the Outside World}\label{TeXcomm} + +This +chapter treats those commands that bear relevance to +\n{dvi} files and formats. It gives some global information +about \IniTeX, font and format files, +Computer Modern typefaces, and \web. + +\begin{inventory} +\item [\cs{dump}] + Dump a format file; possible only in \IniTeX, + not allowed inside a group. + +\item [\cs{special}] + Write a \gr{balanced text} to the \n{dvi} file. + +\item [\cs{mag}] + 1000 times the magnification of the document. + +\item [\cs{year}] + The year of the current job. + +\item [\cs{month}] + The month of the current job. + +\item [\cs{day}] + The day of the current job. + +\item [\cs{time}] + Number of minutes after midnight that the current job started. + +\item [\cs{fmtname}] + Macro containing the name of the format dumped. + +\item [\cs{fmtversion}] + Macro containing the version of the format dumped. + +\end{inventory} + + +%\point \TeX, \IniTeX, \VirTeX +\section{\TeX, \IniTeX, \VirTeX} + +In the terminology established in {\italic \TeX: the Program}, +\cite{Knuth:TeXprogram}, +\term\TeX\par\term\IniTeX\par\term\VirTeX\par +\TeX\ programs come in three flavours. +\IniTeX\ is a version of \TeX\ that can generate formats; +\VirTeX\ is a production version without preloaded format, +and \TeX\ is a production version with +preloaded (plain) format. Unfortunately, this terminology is +not adhered to in general. A~lot of systems do not use preloaded +formats (the procedure for making them may be impossible on +some operating systems), +and call the `virgin \TeX' simply \TeX. +This manual also follows that convention. + +%\spoint Formats: loading +\subsection{Formats: loading} + +A format file (usually with extension~\n{.fmt}) +is a compact dump of \TeX's internal structures. +\term format files\par +Loading a format file takes a considerably shorter time than +would be needed for +loading the font information and the macros that +constitute the format. + +Both \TeX\ and \IniTeX\ can load a format; the user specifies +this by putting the name on the command line +\begin{verbatim} +% tex &plain +\end{verbatim} +or at the \n{**} prompt +\begin{verbatim} +% tex +This is TeX. Version .... +** &plain +\end{verbatim} +preceded by an ampersand (for UNIX, this should be \verb>\&> on +the command line). An input file name can follow the +format name in both places. + +\IniTeX\ does not need a format, +but if no format is specified for (Vir)\TeX, it will try to +load the plain format, and halt if that cannot be found. + +%\spoint Formats: dumping +\subsection{Formats: dumping} + +\IniTeX\ is the only version of \TeX\ +that can dump a format, since it is +the only version of \TeX\ that has +the command~\csidx{dump}, +which causes the internal structures +to be dumped as a format. +It is also the only version of \TeX\ that has the command +\cs{patterns}, which +is needed to specify a list of hyphenation +patterns. + +Dumping is not allowed inside a group, that is +\begin{verbatim} +{ ... \dump } +\end{verbatim} +is not allowed. This restriction +prevents difficulties with \TeX's save stack. +After the \cs{dump} command \TeX\ gives an elaborate listing of +its internal state, and of the font names associated with +fonts that have been loaded and ends the job. + +An interesting possibility arises from the fact that +\IniTeX\ can both load and dump a format. +Suppose you have written a set of macros that build +on top of plain \TeX, \n{superplain.tex}. +You could then call +\begin{verbatim} +% initex &plain superplain +*\dump +\end{verbatim} +and get a format file \n{superplain.fmt} that +has all of plain, and all of your macros. + +%\spoint Formats: preloading +\subsection{Formats: preloading} + +On some systems it is possible to interrupt a running program, +and save its `core image' such that this can be started as +an independent program. +The executable made from the +core image of a \TeX\ program interrupted after it has loaded +a format is called a \TeX\ program with preloaded format. +The idea behind preloaded formats is +that interrupting \TeX\ after it has loaded a format, and making +this program available to the user, +saves in each run the time for loading the format. +In the good old days when computers were quite a bit slower +this procedure made sense. +Nowadays, it does not seem so necessary. +Besides, dumping a core image may not always be possible. + +%\spoint The knowledge of \IniTeX +\subsection{The knowledge of \IniTeX} + +If no format has been loaded, \IniTeX\ knows very little. +For instance, it has no open/close group characters. +However, it can not be completely devoid of knowledge +lest there be no way to define anything. + +Here is the extent of its knowledge. +\begin{itemize} \mathsurround=1.5pt +%\flushright:no +\item \verb>\catcode`\\=0>, \verb>\escapechar=`\\> + (see page~\pageref{ini:esc}). +\item \verb>\catcode`\^^M=5>, \verb>\endlinechar=`\^^M> + (see page~\pageref{ini:eol}). +\item \verb>\catcode`\ =10> + (see page~\pageref{ini:sp}). +\item \verb>\catcode`\%=14> + (see page~\pageref{ini:comm}). +\item \verb>\catcode`\^^?=15> + (see page~\pageref{ini:invalid}). +\item \cs{catcode}$x$\n{=11} for $x={}$\n{`a..`z,`A..`Z} + (see page~\pageref{ini:let}). +\item \cs{catcode}$x$\n{=12} for all other character codes\nl + (see page~\pageref{ini:other}). +\item \cs{sfcode}$x$=\n{999} for $x={}$\n{`A..`Z}, + \cs{sfcode}$x$\n{=1000} for all other characters + (see page~\pageref{ini:sf}). +\item \verb>\lccode`a..`z,`A..`Z=`a..`z>, \verb>\uccode`a..`z,`A..`Z=`A..`Z>, + \cs{lccode}$x$\n{=0}, \cs{uccode}$x$\n{=0} for all other characters + (see page~\pageref{ini:uclc}). +\item \verb>\delcode`.=0>, \cs{delcode}$x$\n{=-1} for all other characters + (see page~\pageref{ini:del}). +\item \cs{mathcode}$x$\n{="!7100}${}+x$ for all lowercase and uppercase + letters, \cs{mathcode}$x$\n{="!7000}${}+x$ for all digits, + \cs{mathcode}$x$\n=$x$ for all other characters + (see page~\pageref{ini:fam}). +\item \cs{tolerance=10000}, \cs{mag=1000}, + \cs{maxdeadcycles=25}. +\end{itemize} + +%\spoint Memory sizes of \TeX\ and \IniTeX +\subsection{Memory sizes of \TeX\ and \IniTeX} + +The main memory size of \TeX\ and \IniTeX\ is controlled by +four constants in the source code: +\n{mem\_bot}, \n{mem\_top}, \n{mem\_min}, and~\n{mem\_max}. +For Ini\TeX's memory \n{mem\_bot${}={}$mem\_min} +and \n{mem\_top${}={}$mem\_max}; +for \TeX\ \n{mem\_bot} and \n{mem\_top} record the main memory +size of the Ini\TeX\ used to dump the format. +Thus versions of \TeX\ and \IniTeX\ have to be adapted +to each other in this respect. + +\TeX's own main memory can be bigger than that of the +corresponding \IniTeX: in general +\n{mem\_min${}\leq{}$mem\_bot} and \n{mem\_top${}\leq{}$mem\_max}. + +For \IniTeX\ a smaller main memory can suffice, +as this program is typically +not meant to do real typesetting. +There may even be a real need for the main memory +to be smaller, because \IniTeX\ needs a lot of auxiliary +storage for initialization and for building the +hyphenation table. + + +%\point More about formats +\section{More about formats} + +%\spoint Compatibility +\subsection{Compatibility} + +\TeX\ has a curious error message: `Fatal format error: I'm stymied', +which is given if \TeX\ tries to load a format that was made +with an incompatible version of \IniTeX. See the point +above about memory sizes, and Chapter~\ref{error} for +the hash size (parameters \n{hash\_size} and \n{hash\_prime}) +and the hyphenation exception dictionary (parameter \n{hyph\_size}). + +%\spoint Preloaded fonts +\subsection{Preloaded fonts} + +During a run of \TeX\ the only information needed about fonts +is the data that is found in the \n{tfm} files (see below). +Since a run of \TeX, especially if the input contains math material, +can easily access 30--40 fonts, the disk access for +all the \n{tfm} files can become significant. +Therefore the plain format and \LaTeX\ load these +metrics files in \IniTeX. A~\TeX\ version using such a format +does not need to load any \n{tfm} files. + +On the other hand, if a format has the possibility of accessing +a range of typefaces, it may be advantageous to have metrics +files loaded on demand during the actual run of \TeX. + +%\spoint The plain format +\subsection{The plain format} + +The first format written for \TeX, and the basis for all +later ones, +is the plain format, described in \TeXbook. +It is a mixture of \begin{itemize} +\item definitions and macros one simply cannot live without +such as the initial \cs{catcode} assignments, +all of the math delimiter definitions, +and the \cs{new...} macros; +\item constructs that are useful, but for which \LaTeX\ +and other packages use +a different implementation, such as the tabbing environment; and +\item some macros that are insufficient for any but the +simplest applications: \cs{item} and \cs{beginsection} +are in this category.\end{itemize} + +It is the first category which Knuth meant to serve as a +foundation for future macro packages, so that they +can live peacefully together (see Chapter~\ref{alloc}). +This idea is reflected in the fact that the name `plain' +is not capitalized: it is the basic set of macros. + +%\spoint The \LaTeX\ format +\subsection{The \LaTeX\ format} + +The \LaTeX\ format\term\LaTeX\par, +written by Leslie Lamport of Digital Equipment Corporation +and described in~\cite{Lamport:LaTeX}, +was released around 1985. +The \LaTeX\ format, using its own version +of \n{plain.tex} (called \n{lplain.tex}), +is not compatible with plain \TeX; +a~number of plain macros are not available. Still, it contains +large parts of the plain format (even when they overlap with +its own constructs). + +\LaTeX\ is a powerful format with facilities such as +marginal notes, floating objects, cross referencing, +and automatic table of contents generation. +Its main drawback is that the `style files' which +define the actual layout are quite hard to write +(although \LaTeX\ is in the process of a major revision, +in which this problem will be tackled; +see \cite{Frank} and~\cite{Frank2}). +As a result, +people have had at their disposal mostly the styles +written by Leslie Lamport, the layout of which is +rather idiosyncratic. See~\cite{BEP} for a successful +attempt to replace these styles. + +%\spoint Mathematical formats +\subsection{Mathematical formats} + +There are two formats with extensive facilities for +mathematics typesetting: +\AmsTeX~\cite{Ams} +(which originated at the American Mathematical Society) +and \LamsTeX~\cite{Lams}. +The first of these includes more facilities than plain \TeX\ +or \LaTeX\ for typesetting mathematics, but it lacks +features such as automatic numbering and cross-referencing, +available in \LaTeX, for instance. \LamsTeX, then, is the +synthesis of \AmsTeX\ and \LaTeX. Also it includes +still more features for mathematics, such as complicated +tables and commutative diagrams. + +%\spoint Other formats +\subsection{Other formats} + +Other formats than the above exist: +for instance, \n{Phyzzx}~\cite{Phyzzx}, \n{TeXsis}~\cite{TeXsis}, +Macro \TeX~\cite{Amy}, \n{eplain}~\cite{Berry}, +and \n{\TeX T1}~\cite{TeXT1}. +Typically, such formats provide the facilities of \LaTeX, but +try to be more easily adaptable by the user. +Also, in general they +have been written with the intention of being an +add-on product to the plain format. + +This book is also written in an `other format': +the \n{lollipop} format. +\term Lollipop\par +This format does not contain user macros, but the +tools with which a style designer can program them; see~\cite{EL}. + +%\point The \n{dvi} file +\section{The \n{dvi} file} + +The \n{dvi} file (this term stands for `device independent') +\term \n{dvi} file\par +contains the output of a \TeX\ run: it +contains compactly dumped representations of boxes that +have been sent there by \cs{shipout}\gr{box}. The act +of shipping out usually occurs inside the output routine, +but this is not necessarily so. + +%\spoint The \n{dvi} file format +\subsection{The \n{dvi} file format} + +A \n{dvi} file is a byte-oriented file, +consisting of a preamble, a postamble, +and a list of pages. + +Access for subsequent software to a completed \n{dvi} file +is strictly sequential in nature: +the pages are stored as a backwards linked list. This +means that only two ways of accessing are possible: +\begin{itemize} \item given the start of a page, the next can be +found by reading until an end-of-page code is encountered, and +\item starting at the end of the file pages can be read +backwards at higher speed, as each beginning-of-page code +contains the byte position of the previous one.\end{itemize} + +The preamble and postamble contain +\begin{itemize}\item the magnification of the document (see below), +\item the unit of measurement used for the document, and +\item possibly a comment string.\end{itemize} +The postamble contains in addition a list of the font definitions +that appear on the pages of the file. + +Neither the preamble nor the postamble +of the file contains a +table of byte positions of pages. +The full definition of the \n{dvi} file format can be found +in~\cite{Knuth:TeXprogram}. + +%\spoint Page identification +\subsection{Page identification} + +Whenever a \cs{shipout} occurs, \TeX\ also writes the +values of counters 0--9 to the \n{dvi} file and the terminal. +Ordinarily, only counter~0, the page number, is used, and the +other counters are zero. Those zeros are not output to the +terminal. The other counters can be used to indicate further +structure in the document. Log output shows the non-zero +counters and the zero counters in between. + + +%\spoint Magnification +\subsection{Magnification } + +Magnification of a document can be indicated by the \gr{integer +parameter} +\term magnification\par\cstoidx mag\par +\cs{mag}, which specifies 1000 times the magnification +ratio. + +The \n{dvi} file contains the value of \cs{mag} for the +document in its preamble and postamble. +If no {\tt true} dimensions are used +the \n{dvi} file will look the same as when no magnification +would have been used, except for the \cs{mag} value in the +preamble and the postamble. + +Whenever a {\tt true} dimension is used it is divided +by the value of \cs{mag}, so that the final output will have +the dimension as prescribed by the user. +The \cs{mag} parameter cannot be changed after a +\n{true} dimension has been used, or after the first +page has been shipped to the \n{dvi} file. + +Plain \TeX\ has the \csidx{magnification} macro for +globally sizing the document, without changing + the physical size of the page: +\begin{verbatim} +\def\magnification{\afterassignment\m@g\count@} +\def\m@g{\mag\count@ + \hsize6.5truein\vsize8.9truein\dimen\footins8truein} +\end{verbatim} +The explanation for this is +as follows: the command \cs{m@g} is saved with an \cs{afterassignment} +command, and the magnification value (which is 1000 times the +actual magnification factor) is assigned to \cs{count@}. +After this assignment, the macro \cs{m@g} assigns +the magnification value to \cs{mag}, and the horizontal +and vertical size are reset to +their original values {\tt 6.5truein} and {\tt 8.9truein}. +The \cs{footins} is also reset. + +%\point[special] Specials +\section{Specials} +\label{special} + +\mdqon +\TeX\ is to a large degree machine"-independent, but it still needs +\mdqoff +\term specials\par +a hook for machine-dependent extensions. This is the +\csidx{special} command, which writes a \gr{balanced text} +to the \n{dvi} file. \TeX\ does not interpret this token list: +it assumes that the printer driver knows what to do with it. +\cs{special} commands are supposed not to change the +$x$ and $y$ position on the page, so that the implementation +of \TeX\ remains independent of the actual device driver +\term device drivers\par +that handles the \cs{special}. + +The most popular application of specials is probably the +inclusion of graphic material, written in some +page description language, such as PostScript\term PostScript\par. +The size of the graphics can usually be determined from +the file containing it (in the case of encapsulated +PostScript through +the `bounding box' data), so \TeX\ can leave space for +such material. + +%\point Time +\section{Time} + +\TeX\ has four parameters, \csidx{year}, \csidx{month}, \csidx{day}, and +\csidx{time}, that tell +\term time\par\term date\par +the time when the current job started. +After this, the parameters are not updated. +The user can change them at any time. + +All four parameters are integers; the \cs{time} parameter +gives the number of minutes since midnight that the current +job started. + +%\point Fonts +\section{Fonts} + +Font information is split in the \TeX\ system into +the metric information (how high, wide, and deep is a character), +and the actual description of the characters in a font. +\TeX, the formatter, needs only the metric information; +printer drivers and screen previewers need the character +descriptions. With this approach it is for instance possible +for \TeX\ to use with relative ease the resident fonts of +a printer. + +%\spoint Font metrics +\subsection{Font metrics} + +The metric information of \TeX's fonts is stored in \n{tfm} +\term font metrics\par +files, which stands for `\TeX\ font metric' files. +Metrics files contain the following information +(see \cite{Knuth:TeXprogram} for the full definition): +\begin{itemize}\item the design size of a font; +\item the values for the \cs{fontdimen} parameters +(see Chapter~\ref{font}); +\item the height, depth, width, and italic correction + of individual characters; +\item kerning tables; +\item ligature tables; +\item information regarding successors and extensions +of math characters (see Chapter~\ref{mathchar}). +\end{itemize} +Metrics files use a packed format, but they can be converted +to and from a readable format by the auxiliary programs +\n{tftopl} and \n{pltotf} (see~\cite{K:Fuchs}). +Here \n{pl} stands for `property list', +a term deriving from the programming language Lisp. +Files in \n{pl} format are just text, so they can easily be edited; +after conversion +they can then again be used as \n{tfm} files. + +%\spoint[virtual:fonts] Virtual fonts +\subsection{Virtual fonts} +\label{virtual:fonts} + +With `virtual fonts' (see~\cite{K:virt}) it is possible that +\term virtual fonts\par +what looks like one font to \TeX\ resides in more than +one physical font file. Also, virtual fonts can be used +to change in effect the internal organization of font files. + +For \TeX\ itself, the +presence of virtual fonts makes no difference: everything +is still based on \n{tfm} files containing metric +information. However, the screen or printer driver that displays +the resulting \n{dvi} file on the screen or on a printer +will search for files with extension \n{.vf} to determine +how characters are to be interpreted. +The \n{vf} file can, for instance, instruct the driver +to interpret a character as a certain position +in a certain font file, to interpret a character as more +than one position (a~way of forming accented characters), +or to include \cs{special} information (for +instance to set gray levels). + +Readable variants of \n{vf} files have extension \n{vpl}, +analogous to the \n{pl} files for the \n{tfm} files; see above. +Conversion between \n{vf} and \n{vpl} files can be +performed with the \n{vftovp} and \n{vptovf} programs. + +However, because virtual fonts are a matter for +\term device drivers\par +device drivers, no more details will be given in this book. + +%\spoint Font files +\subsection{Font files} + +Character descriptions are stored in three types of files. +\term font files\par +\begin{description} \item [gf] + Generic Font files. +This is the file type that the Metafont program generates. +There are not many previewers or printer drivers that use +this type of file directly. +\item [pxl] + Pixel files. The \n{pxl} format is a pure bitmap format. +Thus it is easy to generate \n{pxl} files from, for instance, +scanner images. + +This format should be superseded by the \n{pk} format. +Pixel files can become rather big, +as their size grows quadratically in the size of the characters. + +\item [pk] + Packed files. Pixel files can be packed by a form of run-length +encoding: instead of storing the complete bitmap only the +starting positions and lengths of `runs' of black and white +pixels are stored. This makes the size of \n{pk} files +approximately linear in the size of the characters. +However, a previewer or printer driver using a packed font file +has to unpack it before it is able to use it. +\end{description} + +The following conversion programs exist: +\n{gftopxl}, \n{gftopk}, \n{pktopxl}, \n{pxltopk}. + +%\spoint Computer Modern +\subsection{Computer Modern} + +The only family of typefaces that comes with \TeX\ +in the standard distribution is the `Computer +\term Computer Modern typefaces\par +Modern' family. This is an adaptation (using the terminology +of~\cite{S}) by Donald Knuth of the Monotype Modern~8A typeface +that was used for the first volume of his {\italic Art of Computer +Programming\/} series. The `modern faces' all derive from the +types that were cut between 1780 and 1800 by Firmin Didot in +France, Giambattista Bodoni in Italy, and Justus Erich Walbaum +in Germany. After the first two, these types are also called +`Didone' types. This name was coined in the Vox classification +of types \cite{Vox}. Ultimately, the inspiration for the Didone +types is the `Romain du Roi', the type that was designed by +Nicolas Jaugeon around 1692 for the French Imprimerie Royale. + +Didone types are characterized by a strong vertical orientation, +and thin hairlines. The vertical accent is strengthened by the +fact that the insides of curves are flattened. +The result is a clear and brilliant page, provided that the +printing is done carefully and on good quality paper. +\message{Reference format} +However, they are quite vulnerable; \cite{Up} +compares them to the distinguished but fragile furniture +from the same period, saying one is afraid to use either, +`for both seem in danger of breaking in pieces'. +With the current proliferation of low resolution (around +300 dot per inch) printers, the Computer Modern is +a somewhat unfortunate choice. + +Recently, Donald Knuth has developed +a new typeface (or rather, a subfamily of typefaces) +by changing parameters +in the Computer Modern family. The result is a so-called +`Egyptian' typeface: Computer Concrete \cite{K:cc}. +The name derives from the +fact that it was intended primarily for the book {\italic Concrete +Mathematics}. Egyptian typefaces (they fall under the `M\'ecanes' +in the Vox classification, meaning constructed, +not derived from written letters) have a very uniform line width +and square serifs. They do not have anything to do with Egypt; +such types happened to be popular in the first half of the nineteenth +century when Egyptology was developing and popular. + +%\point \TeX\ and web +\section{\TeX\ and web} + +The \TeX\ program is written in \web, a programming language +\term \web\par\term Pascal\par +that can be considered as a subset of Pascal, augmented with +a preprocessor. + +\TeX\ makes no use of some features of Pascal, in order to +facilitate porting to Pascal systems other than the one +it was originally designed for, and even to enable automatic +translation to other programming languages such as~C. +For instance, it does not use the Pascal \n{With} construct. +Also, procedures do not have output parameters; apart from +writing to global variables, the only way +values are returned is through +\n{Function} values. + +Actually, \web\ is more than a superset of a subset of Pascal +(and to be more precise, it can also be used with other +programming languages); +it is a `system of structured documentation'. This means that +the \web\ programmer writes pieces of program code, +interspersed with their documentation, in one file. +This idea of `literate programming' was +introduced in~\cite{K:literate}; +for more information, see~\cite{Sewell}. + +Two auxiliary programs, +Tangle and Weave, can then be used to strip the documentation +and convert \web\ into regular Pascal, or to convert the +\web\ file into a \TeX\ file that will typeset the program +and documentation. + +Portability of \web\ programs is achieved by the `change file' +mechanism. A~change file is a list of changes to be made to +the \web\ file; a~bit like a stream editor script. +These changes can comprise both adaptations of the \web\ file +to the particular Pascal compiler that will be used, and +bug fixes to \TeX. Thus the \n{TeX.web} file need never be edited. + + +%\point The \TeX\ Users Group +\section{The \TeX\ Users Group} + +\TeX\ users have joined into several users groups +\term TUG\par +over the last decade. Many national or language +users groups exist, and a lot of them publish newsletters. +The oldest of all \TeX\ users groups is simply called +that: the \TeX\ Users Group, or TUG, +and its journal is called {\italic TUGboat}\term TUGboat\par. +You can reach them at +\begin{disp} \TeX\ Users Group\nl P.O. Box 2311\nl + Portland, OR 97208-2311, USA +\end{disp} + or electronically at \n{office@tug.org} on the Internet. + + +%%%% end of input file [run] + +%\InputFile:trace +%%%% this is input file [trace] +%\subject[trace] Tracing +\endofchapter +\chapter{Tracing}\label{trace} + +\TeX's workings are often quite different from what +\term tracing\par\term statistics\par +the programmer expected, so there are ways to discover how \TeX\ +arrived at the result it did. The \cs{tracing...} +commands write +all information of a certain kind to the log file +(and to the terminal if \cs{tracingonline} is positive), +and a number of \cs{show...} commands can be used to ask the +current status or value of various items of \TeX. + +In the following list, only \cs{show} and \cs{showthe} +display their output on the terminal by default, +other \cs{show...} and \cs{tracing...} commands +write to the log file. They will write in addition to +the terminal if \cs{tracingonline} is positive. + +\begin{inventory} +\item [\cs{meaning}] + Give the meaning of a control sequence as a string of characters. + +\item [\cs{show}] + Display the meaning of a control sequence. + +\item [\cs{showthe}] + Display the result of prefixing a token with \cs{the}. + +\item [\cs{showbox}] + Display the contents of a box. + +\item [\cs{showlists}] + Display + the contents of the partial lists + currently built in all modes. + This is treated on + page~\pageref{showlists}. + +\item [\csidx{tracingcommands}] + If this is~1 \TeX\ displays primitive commands executed; + if this is 2~or more the outcome of conditionals is also recorded. + +\item [\csidx{tracingmacros}] + If this is~1, \TeX\ shows expansion of macros + that are performed and the actual values of the arguments; + if this is 2~or more \gr{token parameter}s such as + \cs{output} and \cs{everypar} are also traced. + +\item [\cs{tracingoutput}] + If this is positive, the log file shows a dump of boxes + that are shipped to the \n{dvi} file. + +\item [\cs{showboxdepth}] + The number of levels of box dump that are shown when + boxes are displayed. + +\item [\cs{showboxbreadth}] + Number of successive elements on each level that are shown when + boxes are displayed. + +\item [\csidx{tracingonline}] + If this parameter is positive, \TeX\ will write trace + information to the terminal in addition to the log file. + +\item [\cs{tracingparagraphs}] + If this parameter is positive, \TeX\ generates + a trace of the line breaking algorithm. + +\item [\csidx{tracingpages}] + If this parameter is positive, \TeX\ generates + a trace of the page breaking algorithm. + +\item [\csidx{tracinglostchars}] + If this parameter is positive, \TeX\ gives + diagnostic messages whenever a character is accessed that + is not present in a font. + Plain default:~1. + +\item [\csidx{tracingrestores}] + If this parameter is positive, \TeX\ will report + all values that are restored when a group ends. + +\item [\cs{tracingstats}] + If this parameter is~1, \TeX\ reports at the + end of the job the usage of various internal arrays; + if it is~2, the memory demands are given whenever + a page is shipped out. + +\end{inventory} + +%\point Meaning and content: \cs{show}, \cs{showthe}, \cs{meaning} +\section{Meaning and content: \protect\cs{show}, \protect\cs{showthe}, \protect\cs{meaning}} + +The meaning of control sequences, and the contents of those +that represent internal quantities, can be obtained +by the primitive commands \cs{show}, \cs{showthe}, +and~\cs{meaning}. + +The control sequences \cs{show} and \cs{meaning} are similar: +\alt +the former will give +\cstoidx show\par\cstoidx meaning\par +output to the log file and the terminal, whereas the latter +will produce the same tokens, but they are placed in \TeX's +input stream. + +The meaning of a primitive command of \TeX\ is that command itself: +\begin{verbatim} +\show\baselineskip +\end{verbatim} +gives +\begin{verbatim} +\baselineskip=\baselineskip +\end{verbatim} +The meaning of a defined quantity is its definition: +\begin{verbatim} +\show\pageno +\end{verbatim} +gives +\begin{verbatim} +\pageno=\count0 +\end{verbatim} +The meaning of a macro is its parameter text and replacement text: +\begin{verbatim} +\def\foo#1?#2\par{\set{#1!}\set{#2?}} +\show\foo +\end{verbatim} +gives +\begin{verbatim} +\foo=macro: +#1?#2\par ->\set {#1!}\set {#2?} +\end{verbatim} +For macros without parameters the part before the arrow +(the parameter text) is empty. + +The \csidx{showthe} command will display on the log file and terminal +the tokens that \cs{the} produces. +After \cs{show}, \cs{showthe}, \cs{showbox}, and \cs{showlists} +\TeX\ asks the user for input; this can be prevented +by specifying \cs{scrollmode}. +Characters generated +by \cs{meaning} and \cs{the} have category~12, except for spaces +(see page~\pageref{cat12}); +the value of \cs{escapechar} is used when control sequences +are represented. + +%\point Show boxes: \cs{showbox}, \cs{tracingoutput} +\section{Show boxes: \protect\cs{showbox}, \protect\cs{tracingoutput}} + +If \cs{tracingoutput} is positive the log file will +\cstoidx tracingoutput\par\cstoidx showbox\par +receive a dumped representation of all boxes that are +written to the \n{dvi} file with \cs{shipout}. +The same representation is used +by the command \cs{showbox}\gr{8-bit number}. + +In the first case \TeX\ will report `Completed box being shipped out'; +in the second case it will enter \cs{errorstopmode}, and +tell the user `OK. (see the transcript file)'. +If \cs{tracingonline} is positive, the box is also displayed +on the terminal; if \cs{scrollmode} has been specified, +\TeX\ does not stop for input. + +The upper bound on the +number of nested boxes that is dumped is \cs{showboxdepth}; +\cstoidx showboxdepth\par\cstoidx showboxbreadth\par +each time a level is visited at most \cs{showboxbreadth} +items are shown, the remainder of the list is summarized +with~\n{etc.} +For each box its height, depth, and width +are indicated in that order, and for characters it is +stated from what font they were taken. + +\begin{example} After +\begin{verbatim} +\font\tenroman=cmr10 \tenroman +\setbox0=\hbox{g} +\showbox0 +\end{verbatim} +the log file will show +\begin{verbatim} +\hbox(4.30554+1.94444)x5.00002 +.\tenroman g +\end{verbatim} +indicating that the box was \n{4.30554pt} high, +\n{1.94444pt} deep, and \n{5.00002pt} wide, and that it contained +a character `g' from the font \cs{tenroman}. +Note that the fifth decimal of all sizes may be rounded +because \TeX\ works with multiples of $2^{-16}$\n{pt}. +\message{ifmath: scriptfont fam0 fill!} +\end{example} + +The next example has nested boxes, +\begin{verbatim} +\vbox{\hbox{g}\hbox{o}} +\end{verbatim} +and it contains \cs{baselineskip} glue between the boxes. +After a \cs{showbox} command the log file output is: +\begin{verbatim} +\vbox(16.30554+0.0)x5.00002 +.\hbox(4.30554+1.94444)x5.00002 +..\tenroman g +.\glue(\baselineskip) 5.75002 +.\hbox(4.30554+0.0)x5.00002 +..\tenroman o +\end{verbatim} +Each time a new level is entered an extra dot is added to +the front of the line. Note that \TeX\ tells explicitly +that the glue is \cs{baselineskip} glue; +it inserts names like this for all automatically inserted glue. +The value of +the baselineskip glue here is such that the baselines of +the boxes are at 12 point distance. + +Now let us look at explicit (user) glue. \TeX\ indicates the ratio +by which it is stretched or shrunk. + +\begin{example}s +\begin{verbatim} +\hbox to 20pt {\kern10pt \hskip0pt plus 5pt} +\end{verbatim} +gives (indicating that the available stretch has been +multiplied by~\n{2.0}): +\begin{verbatim} +\hbox(0.0+0.0)x20.0, glue set 2.0 +.\kern 10.0 +.\glue 0.0 plus 5.0 +\end{verbatim} +and +\begin{verbatim} +\hbox to 0pt {\kern10pt \hskip0pt minus 20pt} +\end{verbatim} +gives (the shrink has been multiplied by~\n{0.5}) +\begin{verbatim} +\hbox(0.0+0.0)x0.0, glue set - 0.5 +.\kern 10.0 +.\glue 0.0 minus 20.0 +\end{verbatim} +respectively. +\end{example} + +This is an example with infinitely stretchable or shrinkable +glue: +\begin{verbatim} +\hbox(4.00000+0.14000)x15.0, glue set 9.00000fil +\end{verbatim} +This means that the horizontal box contained \n{fil} glue, and +it was set such that its resulting width was \n{9pt}. + +Underfull boxes are dumped like all other boxes, but +the usual `\n{Underfull hbox detected at line...}' +is given. Overfull horizontal boxes contain a vertical rule +of width \cs{overfullrule}: +\begin{verbatim} +\hbox to 5pt {\kern10pt} +\end{verbatim} +gives +\begin{verbatim} +\hbox(0.0+0.0)x5.0 +.\kern 10.0 +.\rule(*+*)x5.0 +\end{verbatim} + + +Box leaders are not dumped completely: +\begin{verbatim} +.\leaders 40.0 +..\hbox(4.77313+0.14581)x15.0, glue set 9.76852fil +...\tenrm a +...\glue 0.0 plus 1.0fil +\end{verbatim} +is the dump for +\begin{verbatim} +\leaders\hbox to 15pt{\tenrm a\hfil}\hskip 40pt +\end{verbatim} +Preceding or trailing glue around the leader +boxes is also not indicated. + +%\point Global statistics +\section{Global statistics} + +The parameter \csidx{tracingstats} can be used to force \TeX\ +to report at the end of the job the global use of resources. +Some production versions of \TeX\ may not have this option. + +As an example, here are the statistics for this book: +\begin{verbatim} +Here is how much of TeX's memory you used: +\end{verbatim} +String memory (bounded by `pool size'): +\begin{verbatim} + 877 strings out of 4649 + 9928 string characters out of 61781 +\end{verbatim} +Main memory, control sequences, font memory: +\begin{verbatim} + 53071 words of memory out of 262141 + 2528 multiletter control sequences out of 9500 + 20137 words of font info for 70 fonts, + out of 72000 for 255 +\end{verbatim} +Hyphenation: +\begin{verbatim} + 14 hyphenation exceptions out of 607 +\end{verbatim} +Stacks: input, nest, parameter, buffer, and save stack respectively, +\begin{verbatim} + 17i,6n,19p,245b,422s stack positions out of + 300i,40n,60p,3000b,4000s +\end{verbatim} + +% \begin{comment} +% \endinput + +% %\point Line breaking: \cs{tracingparagraphs} +% \section{Line breaking: \cs{tracingparagraphs}} + +% If \cs{tracingparagraphs} is positive, \TeX's line breaking +% \cstoidx tracingparagraphs\par +% algorithm will generate trace output. However, on some \TeX\ +% implementations this trace mode may have been disabled to get a +% faster running system. + +% Consider an example paragraph of \TeX: +% \begin{verbatim} +% \hsize=3in \parindent=0cm \frenchspacing +% \pretolerance=500 +% This is a sample paragraph to show the trace output that +% \TeX's line breaking algorithm produces. Some \TeX\ systems +% cannot generate this trace, as the relevant piece of code +% has been commented out for speed optimisation. +% With ever faster computers this won't be necessary any more. +% \end{verbatim} + +% \TeX\ first attempts to break the paragraph without +% hyphenation, and it will accept solutions where each +% line has a badness less than \cs{pretolerance}. +% \begin{verbatim} +% @firstpass +% \end{verbatim} Report that the first pass has started; +% \begin{verbatim} +% []\tenrm This is a sample paragraph to show the trace +% \end{verbatim} +% Apparently this is the only way to fill the first line; +% \begin{verbatim} +% @ via @@0 b=263 p=0 d=84529 +% \end{verbatim} and doing so +% had badness~263, a zero penalty, and a resulting 84529 +% demerit points. +% \begin{verbatim} +% @@1: line 1.0 t=84529 -> @@0 +% \end{verbatim} Conclusion: +% breakpoint~1 (\verb>@@1>) occurs on line~1, and it makes the +% line `very loose' (indicated by the~\n{.0}), +% and the total demerits are +% 84529 if the previous breakpoint was number~0. + +% The first pass is now aborted. +% \begin{verbatim} +% @secondpass +% []\tenrm This is a sam-ple para-graph to show the trace out- +% @\discretionary via @@0 b=2 p=50 d=2644 +% @@1: line 1.2- t=2644 -> @@0 +% \end{verbatim} +% With a very small badness of~2, but with 50 penalty points +% for breaking at a hyphen, this line is `decent' +% (indicated by the~\n{.2}), and the total of demerit points +% is~2644. + +% The second line is also straighforward: +% \begin{verbatim} +% put that T[]X's line break-ing al-go-rithm pro-duces. +% @ via @@1 b=0 p=0 d=100 +% @@2: line 2.2 t=2744 -> @@1 +% \end{verbatim} +% The demerits now derive solely from the \cs{linepenalty}, +% which is~10. Similarly the third line: +% \begin{verbatim} +% Some T[]X sys-tems can-not gen-er-ate this trace, as +% @ via @@2 b=1 p=0 d=121 +% @@3: line 3.2 t=2865 -> @@2 +% \end{verbatim} + +% For the fourth line two possibilities exist: +% it can be set `loose' with 9409 demerit points +% \begin{verbatim} +% the rel-e-vant piece of code has been com-mented +% @ via @@3 b=87 p=0 d=9409 +% @@4: line 4.1 t=12274 -> @@3 +% \end{verbatim} +% or, fitting in an extra word, it can be set `tight' with +% 2601 demerit points +% \begin{verbatim} +% out +% @ via @@3 b=41 p=0 d=2601 +% @@5: line 4.3 t=5466 -> @@3 +% \end{verbatim} + +% Line 5 can be set in three ways: +% coming from breakpoint~4 it can be broken as +% \begin{verbatim} +% for speed op-ti-mi-sa-tion. With ever faster com- +% @\discretionary via @@4 b=0 p=50 d=2600 +% @@6: line 5.2- t=14874 -> @@4 +% \end{verbatim} +% and coming from breakpoint~5 there are two ways: +% \begin{verbatim} +% put- +% @\discretionary via @@5 b=2 p=50 d=2644 +% @@7: line 5.2- t=8110 -> @@5 +% \end{verbatim} +% and \begin{verbatim} +% ers +% @ via @@5 b=84 p=0 d=8836 +% @@8: line 5.3 t=14302 -> @@5 +% \end{verbatim} +% Of the three, the last possibility is the only one that +% does not involve hyphenating line~5. + +% As line 6 is the last line of the paragraph, coming from +% breakpoints 6 or~7 gives an extra 5000 demerit points +% from the \cs{finalhyphendemerits}. +% \begin{verbatim} +% this won't be nec-es-sary any more. +% @\par via @@6 b=0 p=-10000 d=5100 +% @\par via @@7 b=0 p=-10000 d=5100 +% @\par via @@8 b=0 p=-10000 d=100 +% @@9: line 6.2- t=13210 -> @@7 +% \end{verbatim} +% However, coming from breakpoint 7 still gives the least +% demerits. + +% \end{comment} +%%%% end of input file [trace] + +%\InputFile:errors +%%%% this is input file [errors] +%\subject[error] Errors, Catastrophes, \nl and Help +\endofchapter +\chapter{Errors, Catastrophes, and Help}\label{error} + +When \TeX\ is running, various errors can occur. +This chapter treats how errors in the input are displayed, +and what sort of overflow of internal data structures +of \TeX\ can occur. + +\begin{inventory} +\item [\cs{errorcontextlines}] + (\TeX3 only) + Number of additional context lines shown in error messages. + +\item [\cs{errmessage}] + Report an error, giving the parameter of this command as message. + +\item [\cs{errhelp}] + Tokens that will be displayed if the user + asks further help after an \cs{errmessage}. + +\end{inventory} + +%\point Error messages +\section{Error messages} + +When \TeX\ is running in \cs{errorstopmode} (which it usually is; +see Chapter~\ref{run} for the other running modes), +errors occurring are reported on the user terminal, and \TeX\ +asks the user for further instructions. +Errors can occur either because of some internal condition +of \TeX, or because a macro has issued an \csidx{errmessage} +command. + +If an error occurs \TeX\ shows the input +\term error patching\par +line +on which the error occurred. If the offending command was +not on that line but, for instance, in a macro that was +called \ldash possibly indirectly \rdash from that line, +the line of that command is also shown. +If the offending command was indirectly called, +an additional \csidx{errorcontextlines} number of lines +is shown with the preceding macro calls. + +A~value of \cs{errorcontextlines}${}=0$ causes \n{...} +to be printed as the sole indication that there is a context. +Negative values inhibit even this. + +For each macro in the sequence that leads to the offending +command, +\TeX\ attempts to display some +preceding and some following tokens. +First one line is displayed ending with +the \ldash indirectly \rdash offending command; then, one line lower +some following tokens are given. + +\begin{example} +\begin{verbatim} +This paragraph ends \vship1cm with a skip. +\end{verbatim} +gives +\begin{verbatim} +! Undefined control sequence. +l.1 This paragraph ends \vship + 1cm with a skip. +\end{verbatim} +\end{example} + +If \TeX\ is not running in some non-stop mode\label{interaction}, +the user is given the chance to patch errors or to +ask for further information. In general the following +options are available:\begin{description}\item [\gr{return}] +\TeX\ will continue processing. If the error was something +innocent that \TeX\ could either ignore or patch itself, +this is the easy way out. +\item [\n h] +Give further details about the error. +If the error was caused by an \cs{err\-message} command, +the \csidx{errhelp} tokens will be displayed here. +\item [\n i] +Insert. The user can insert some material. For example, +if a control sequence is misspelled, the correct command can +sometimes be inserted, as \begin{verbatim} +i\vskip +\end{verbatim} +for the above +example. Also, this is an opportunity for inserting +\cs{show} commands to inspect \TeX's internal state. +However, if \TeX\ is in the middle of +scanning something complicated, +such commands will not be executed, or will even +add to the confusion. +\item [\n s] + (\cs{scrollmode}) +Scroll further errors, but display the messages. +\TeX\ will patch any further errors. +This is a handy option, for instance if the error occurs +in an alignment, because the number of subsequent errors tends +to be rather large. +\item [\n r] + (\cs{nonstopmode}) +Run without stopping. \TeX\ will never stop for user interaction. +\item [\n q] + (\cs{batchmode}) +Quiet running. \TeX\ will never stop for user interaction, +and does not give any more terminal output. +\item [\n x] +Exit. Abort this run of \TeX. +\item [\n e] +Edit. This option is not available on all \TeX\ system. +If it is, the run of \TeX\ is aborted, and an editor is +started, opening with the input file, maybe even +on the offending line. +\end{description} + + +%\point Overflow errors +\section{Overflow errors} + +Harsh reality imposes some restrictions on how elaborate +\term overflow errors\par +\TeX's workings can get. Some restrictions are imposed by +compile-time constants, and are therefore fairly loose, but +some depend strongly on the actual computer implementation. + +Here follows the list of all categories of overflow that +prompt \TeX\ to report `Capacity exceeded'. +Most bounds involved are (determined by) compile-time +constants; their values given here in parentheses are those +used in the source listing of \TeX\ in~\cite{Knuth:TeXbook}. +Actual values may differ, and probably will. Remember +that \TeX\ was developed in the good old days when even +big computers were fairly small. + +%\spoint Buffer size {\rm(500)} +\subsection{Buffer size {\rm(500)}} + +Current lines of all files that are open are kept in +\TeX's input buffer, as are control sequence names +that are being built with \verb-\csname...\endcsname-. + +%\spoint Exception dictionary {\rm(307)} +\subsection{Exception dictionary {\rm(307)}} + +The maximum number of hyphenation exceptions specified +by \cs{hyphenation} must be a prime number. +Two arrays with this many halfwords are allocated. + +Changing this number makes formats incompatible; +that is, \TeX\ can only use a format that was made by +an \IniTeX\ with the same value for this constant. + +%\spoint Font memory (20$\,$000) +\subsection{Font memory (20$\,$000)} + +Information about fonts is stored in an array of +memory words. This is easily overflowed by preloading too +many fonts in \IniTeX. + +%\spoint Grouping levels +\subsection{Grouping levels} + +The number of open groups should be recordable +in a quarter word. There is no compile-time constant corresponding +to this. + +%\spoint Hash size {\rm(2100)} +\subsection{Hash size {\rm(2100)}} + +Maximum number of control sequences. It is suggested that +this number should not exceed 10\% of the main memory size. +The values in \TeX\ and \IniTeX\ should agree; also the +\n{hash\_prime} values should agree. + +This value is rather low; for macro packages that are more +elaborate than plain \TeX\ a value of about 3000 is more +realistic. + +%\spoint Number of strings {\rm(3000)} +\subsection{Number of strings {\rm(3000)}} + +The maximum number of strings must be recordable in a half word. + +%\spoint Input stack size {\rm(200)} +\subsection{Input stack size {\rm(200)}} + +For each input source an item is allocated on the input stack. +Typical input sources are input files (but their simultaneous +number is more limited; see below), and token lists +such as token variables, macro replacement texts, and +alignment templates. A~macro with `runaway recursion' +(for example, \verb>\def\mac{{\mac}}>) +will overflow this stack. + +\TeX\ performs some optimization here: before the last call +in a token list all token lists ending with this call are +cleared. This process is +similar to `resolving tail recursion' (see Chapter~\ref{macro}). + +%\spoint Main memory size (30$\,$000) +\subsection{Main memory size (30$\,$000)} + +Almost all `dynamic' objects of \TeX, such as macro definition +texts and all material on the current page, +are stored in the main memory array. +Formats may already take $20\,000$ words of +main memory for macro definitions, and complicated pages containing +for instance the \LaTeX\ picture environment may easily +overflow this array. + +\TeX's main memory is divided in words, and a half word +is supposed to be able to address the whole of the memory. +Thus on current 32-bit computers the most common choice +is to let the main memory size be at most 64K bytes. +A~half word address can then be stored in 16 bits, +half a machine word. + +However, so-called `Big \TeX' implementations exist +\term big \TeX\par +that have a main memory larger than 64K words. +Most compilers will then allocate 32-bit words for +addressing this memory, even if (say) 18 bits would +suffice. Big \TeX s therefore become immediately +a lot bigger when they cross the 64K threshold. +Thus they are usually not found on microcomputers, +although virtual memory schemes for these are possible; +see for instance~\cite{Thull}. + +\TeX\ can have a bigger main memory than \IniTeX; +see Chapter~\ref{TeXcomm} for further details. + +%\spoint Parameter stack size {\rm(60)} +\subsection{Parameter stack size {\rm(60)}} + +Macro parameters may contain macro calls with +further parameters. The number of parameters that may occur +nested is bounded by the parameter stack size. + +%\spoint Pattern memory {\rm(8000)} +\subsection{Pattern memory {\rm(8000)}} + +Hyphenation patterns are stored in a trie array. +The default size of 8000 hyphenation patterns seems sufficient +for English or Italian, for example, but it is not for +Dutch or German. + +%\spoint Pattern memory ops per language +\subsection{Pattern memory ops per language} + +The number of hyphenation ops (see the literature about +hyphenation: \cite{Liang} and appendix~H of~\cite{Knuth:TeXbook}) +should be recordable +in a quarter word. There is no compile-time constant corresponding +to this. \TeX\ version~2 had the same upper bound, but gave no +error message in case of overflow. Again, for languages such +as Dutch and German this bound is too low. +There are versions of \TeX\ that have a higher bound here. + +%\spoint Pool size (32$\,$000) +\subsection{Pool size (32$\,$000)} + +Strings are error messages and control sequence names. +They are stored using one byte per character. +\TeX\ has initially about $23\,000$ characters worth of +strings. + +The pool will overflow if a user defines a large number of +control sequences on top of a substantial macro package. +However, even if the user does not define any new commands +\mdqon +overflow may occur: cross"-referencing schemes also +\mdqoff +work by defining control sequences. For large documents +a pool size of $40\,000$ or $60\,000$ is probably sufficient. + +%\spoint Save size {\rm(600)} +\subsection{Save size {\rm(600)}} + +Quantities that are assigned to inside a group must be +restored after the end of that group. +The save stack is where the values to be restored are kept; +the size of the +save stack limits the number of values that can be restored. + +Alternating global and local assignments to a value +will lead to `save stack build-up': for each local +assignment following a global assignment the +previous value of the variable is saved. Thus an +alternation of such assignments will lead to +an unnecessary proliferation of items on the save stack. + +%\spoint Semantic nest size {\rm(40)} +\subsection{Semantic nest size {\rm(40)}} + +Each time \TeX\ switches to a mode nested inside another +mode (for instance when processing an \verb-\hbox- inside +a \verb-\vbox-) the current state is pushed on the +semantic nest stack. The semantic nest size is the maximum +number of levels that can be pushed. + +%\spoint Text input levels {\rm(6)} +\subsection{Text input levels {\rm(6)}} + +The number of nested \verb-\input- files +has to be very limited, +as the current lines are all kept in the input buffer. + +%%%% end of input file [errors] + +%\InputFile:syntax +%%%% this is input file [syntax] +%\subject[gramm] The Grammar of \TeX +\endofchapter +\chapter{The Grammar of \TeX}\label{gramm} + +Many chapters in this book contain pieces of the +grammar that defines the formal syntax of \TeX. +In this chapter the structure of the rewriting rules of the +grammar is explained, and some key notions are presented. + +In \TeXbook\ a grammar appears in Chapters~24--27. +An even more rigorous grammar of \TeX\ can be found in~\cite{Appelt}. +The grammar presented in this book is virtually identical +to that of \TeXbook. + +%\point Notations +\section{Notations} + +Basic to the grammar are \begin{description}\item [grammatical terms] +These are enclosed in angle brackets:\begin{disp}\gr{term}\end{disp} +\item [control sequences] +These are given in typewriter type with a backslash for +the escape character:\begin{disp}\cs{command}\end{disp} +\end{description} +Lastly there are \begin{description}\item [keywords] +Also given in typewriter type\begin{disp}\n{keyword}\end{disp} +This is a limited collection of words that have a special +meaning for \TeX\ in certain contexts; see below.\end{description} + +The three elements of the grammar are used in syntax rules: +\begin{disp}\gr{snark} $\longrightarrow$ \n{boojum} $|$ \gr{empty} +\end{disp} +This rule says that the grammatical entity \gr{snark} +is either the keyword \n{boojum}, or the grammatical +entity \gr{empty}. + +There are two other notational conventions. +The first is that the double quote +is used to indicate hexadecimal (base~16) notation. +For instance \verb>"ab56> stands for $10\times16^3+11\times16^2 ++5\times16^1+6\times16^0$. The second convention +is that subscripts are used to denote category codes. +Thus \n{a}$_{12}$ denotes an `a' of category~12. + +%\point[keywords] Keywords +\section{Keywords} +\label{keywords} + +A keyword is sequence of characters (or character tokens) +\term keywords\par +of any category code but~13 (active). +Unlike the situation in control sequences, \TeX\ does not +distinguish between lowercase and uppercase characters +in keywords. Uppercase characters in keywords are converted to +lowercase by adding 32 to them; the \cs{lccode} and \cs{uccode} +are not used here. Furthermore, any keyword can be preceded by +optional spaces. + +Thus both \n{true cm} and \n{truecm} are legal. +By far the strangest example, however, is provided +by the grammar rule +\begin{disp}\gr{fil unit} $\longrightarrow$ \n{fil} $|$ \gr{fil unit}\n l +\end{disp} which implies that \hbox{\n{fil L l}} is also +a legal \gr{fil dimen}. Strange errors can ensue from this; +see page~\pageref{fil:l:l} for an example. + +Here is the full list of all keywords: \n{at}, \n{bp}, +\n{by}, \n{cc}, \n{cm}, \n{dd}, \n{depth}, \n{em}, \n{ex}, +\n{fil}, \n{height}, \n{in}, \n l, \n{minus}, \n{mm}, \n{mu}, +\n{pc}, \n{plus}, \n{pt}, \n{scaled}, \n{sp}, \n{spread}, +\n{to}, \n{true}, \n{width}. + +%\point Specific grammatical terms +\section{Specific grammatical terms} + +Some grammatical terms appear in a lot of rules. +One such term is \gr{optional spaces}. It is probably +\term space, optional\par +clear what is meant, but here is the formal definition: +\begin{disp}\gr{optional spaces} $\longrightarrow$ + \gr{empty} $|$ \gr{space token}\gr{optional spaces} + \end{disp} +which amounts to saying that \gr{optional spaces} +is zero or more space tokens. + +Other terms may not be so immediately obvious. +Below are some of them. + +%\spoint \gr{equals} +\subsection{\gr{equals}} + +In assignments the equals sign is optional; therefore there +is a term +\begin{disp}\gr{equals} $\longrightarrow$ \gr{optional spaces} + $|$ \gr{optional spaces}$=_{12}$\end{disp} +in \TeX's grammar. +%% \begin{comment} +%% One assignment exists where the equals sign cannot +%% be left out: +%% \begin{verbatim} +%% \let\spacetoken= %assign a space +%% \end{verbatim} +%% Here the space would have been skipped in \TeX's input processor +%% if the equals sign had been left out. +%% \end{comment} + +%\spoint \gr{filler}, \gr{general text} +\subsection{\gr{filler}, \gr{general text}} + +More obscure than the \gr{optional spaces} is the combination +of spaces and \cs{relax} tokens that is allowed +in some places, for instance +\begin{verbatim} +\setbox0= \relax\box1 +\end{verbatim} +The quantity involved is +\begin{disp}\gr{filler} $\longrightarrow$ \gr{optional spaces} + $|$ \gr{filler}\cs{relax}\gr{optional spaces}\end{disp} +One important occurrence of \gr{filler} is in +\begin{disp}\gr{general text} $\longrightarrow$ + \gr{filler}\lb\gr{balanced text}\gr{right brace} + \end{disp} +A \gr{general text} follows such control sequences as +\cs{message}, \cs{uppercase}, or \cs{mark}. The braces around +the \gr{balanced text} are explained in the next point. + +%\spoint \lb\rb\ and \gr{left brace}\gr{right brace} +\subsection{\lb\rb\ and \gr{left brace}\gr{right brace}} + +The \TeX\ grammar uses a perhaps somewhat unfortunate +convention for braces. First of all \begin{disp}\lb\ and \rb\end{disp} +stand for braces that are either explicit open/close group +characters, or control sequences defined by \cs{let}, +such as \begin{verbatim} +\let\bgroup={ \let\egroup=} +\end{verbatim} +The grammatical terms \begin{disp}\gr{left brace} and \gr{right brace} +\end{disp} stand for explicit open/close group characters, +that is, characters of categories 1 and~2 respectively. + +Various combinations of these two kinds of braces exist. +Braces around boxes can be implicit: +\begin{disp}\cs{hbox}\gr{box specification}\lb + \gr{horizontal mode material}\rb\end{disp} +Around a macro definition there must be explicit braces: +\begin{disp}\gr{definition text} $\longrightarrow$ + \gr{parameter text}\gr{left brace}\gr{balanced text}\gr{right brace} + \end{disp} +Finally, the \gr{general text} that was mentioned above +has to be explicitly closed, but it can be implicitly opened: +\begin{disp}\gr{general text} $\longrightarrow$ + \gr{filler}\lb\gr{balanced text}\gr{right brace} + \end{disp} +The closing brace of a \gr{general text} has to be explicit, +since a general text is a token list, which may +contain \cs{egroup} tokens. +\TeX\ performs expansion to find the opening +brace of a \gr{general text}. + +%\spoint \gr{math field} +\subsection{\gr{math field}} + +In math mode various operations such as subscripting +or applying \cs{underline} take an argument that +is a \gr{math field}: either a single symbol, or +a group. Here is the exact definition. +\begin{disp}\gr{math field} $\longrightarrow$ + \gr{math symbol} $|$ \gr{filler}\lb\gr{math mode material}\rb\nl + \gr{math symbol} $\longrightarrow$ \gr{character} $|$ + \gr{math character} +\end{disp} +See page~\pageref{character} for \gr{character}, +\alt +and page~\pageref{math:character} for \gr{math character}. + +%\point[2vs3] Differences between \TeX\ versions 2 and 3 +\section{Differences between \TeX\ versions 2 and 3} +\label{2vs3} + +In 1989 Knuth released \TeX\ version~3.0, which is +\term \protect\TeX\ version 2\par +the first real change in \TeX\ since version~2.0, +which was released in~1986 (version~0 of \TeX\ was +released in 1982; see~\cite{Knuth:TeXerrors} for more about +the history of \TeX). +All intermediate versions were merely bug fixes. + +The main difference between versions 2~and~3 lies +in the fact that 8-bit input has become possible. +Associated with this, various quantities that +used to be 127 or~128 have been raised to 255 +or~256 respectively. Here is a short list. +The full description is in~\cite{K:TeX23}. + +\begin{itemize}\message{Remove other TeX3 refernces!} +\item All `codes' (\cs{catcode}, \cs{sfcode}, et cetera; + see page~\pageref{codename}) + now apply to 256 character codes instead of~128. +\item A character with code \cs{endlinechar} + is appended to the line unless this parameter is negative +or more than~255 (this was~127) (see page~\pageref{append:elc}). +\item No escape character is output by \cs{write} and + other commands if \cs{escapechar} is negative or more than~255 +(this was~127) (see page~\pageref{use:escape}). +\item The \verb>^^> replacement mechanism has been extended + (see page~\pageref{hathat}). +\item Parameters \cs{language}, \cs{inputlineno}, + \cs{errorcontextlines}, \cs{lefthyphenmin}, \cs{righthyphenmin}, +\cs{badness}, \cs{holdinginserts}, \cs{emergencystretch}, +and commands \cs{noboundary}, \cs{setlanguage} +have been added. +\item The value of \cs{outputpenalty} is no longer zero + \alt + if the page break was not at a penalty item; + instead it is~$10\,000$ (see page~\pageref{break:penalty}). +\end{itemize} + +The plain format has also been updated, mostly +\alt +with default settings for parameters such as +\cs{lefthyphenmin}, but also a few macros have been added. + +\endofchapter +%%%% end of input file [syntax] + +\chapter{Glossary of \TeX\ Primitives} +\begin{raggedright} +\input glossary +\end{raggedright} +\endofchapter + +\chapter{Tables}\label{table} +\pagestyle{plain} +\clearpage +\input tables +\endofchapter + +%\chapter{Index} + +\printindex +%\input \jobname.ind +%\endofchapter % this winds up on a page of its own. + +%\chapter{References} +\mdqon +\bibliography{tex} +\bibliographystyle{plain} +\mdqoff +\endofchapter + +%%%% end of input file [tables] + +\chapter*{Change log} + +\section*{Version 1.1} + +Small remark about \cs{afterassignment} after macro definitions. + +Trouble with indexing macros fixed, I hope. + +Separate letter and a4 versions. + +Better intro for the chapter \ref{space} on spacing. + +\end{document} + +\HasNum:no \ToVerso +\asubject List of Examples\par +\message{set a counter here!}%\SetCounter:point=0 +\def\subjectTitle{List of Examples} +\makeatletter\refresh@mark@item{subjectTitle}{LIST OF EXAMPLES} +\makeatother + +\LoadExternalFile:todo +\EjectPage + +\asubject Index by Command\par +\def\subjectTitle{INDEX BY COMMAND} +\makeatletter\refresh@mark@item{subjectTitle}{INDEX BY COMMAND} +\makeatother +\GutterWidth=1.5pc \NumberOfColumns:3 +\LoadExternalFile:index +\EjectPage + +\begin{comment} +\message{set a counter here!}%\SetCounter:Page=306 \CounterRepresentation:Page=1 +\HasNum:no +\SerifFont %\pointsize:9 \Style:roman +\section{size:9 \Style:roman} +\flushright:no \hyphenpenalty=-50 + +\asubject Index by Topic\par +\def\subjectTitle{INDEX BY TOPIC} +\makeatletter\refresh@mark@item{subjectTitle}{INDEX BY TOPIC} +\makeatother +\GutterWidth=1.5pc \NumberOfColumns:3 +%\GutterWidth=2pc \NumberOfColumns:2 +\message{reg: medskips, \string\n{..}, balance} +\SetListIndent:1=2em +\SetListIndent:2=1em +\LoadExternalFile:register + +\Stop |