123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660 |
- .nr *% \n(%#u+7u
- .ds NR "\f2nroff\fP
- .ds TR "\f2troff\|\fP
- .ds Tr \f2Troff\|\fP
- .ds Nr \f2Nroff\fP
- . \" CW - constant width font not from -ms
- .de T&
- .X "END US
- .X "US T&
- ..
- .de CW
- .nr PQ \\n(.f
- .if \\n(.$=0 .ft CW
- .if \\n(.$>0 \%\&\\$3\f(CW\\$1\\f\\n(PQ\\$2
- ..
- .de BI
- .nr PQ \\n(.f
- .if \\n(.$=0 .ft 4
- .if \\n(.$>0 \%\&\\$3\f2\\$1\\f\\n(PQ\\$2
- ..
- .de UC
- \\$3\s-2\\$1\s+2\\$2
- ..
- .am NH
- .nr p \\np+1
- .nr s 0 1
- ..
- .fp 4 BI LucidaSansI
- .bd 4 3
- .de sc
- .LP
- \f4\\np.\\n+s.\ \ \\$1\f1\0
- ..
- .de bt
- .SP .25
- .LP
- .NE 2.1
- .ta 1.5i 2.5i 3.5i 4.5i
- \\$1 \\$2 \\$3 \\$4
- .IP "" 0.8i
- ....br
- \\$5
- ..
- .
- .
- .
- .
- .
- .
- .
- .TL
- Troff User's Manual
- .AU
- Joseph F. Ossanna
- Brian W. Kernighan
- .sp
- bwk@research.bell-labs.com
- .EQ
- delim @@
- define cw % "\&" font CW %
- .EN
- .SH
- Introduction
- .PP
- \*(Tr and \*(NR are text processors
- that format text for typesetter- and
- typewriter-like terminals, respectively.
- They accept lines of text interspersed with lines of
- format control information and
- format the text into a printable, paginated document
- having a user-designed style.
- \*(Tr and \*(NR offer
- unusual freedom in document styling:
- arbitrary style headers and footers;
- arbitrary style footnotes;
- multiple automatic sequence numbering for paragraphs, sections, etc;
- multiple column output;
- dynamic font and point-size control;
- arbitrary horizontal and vertical local motions at any point;
- and
- a family of automatic overstriking, bracket construction, and
- line-drawing functions.
- .
- .de TL
- .LP
- .ce
- .ps +2
- .ft B
- ..
- .
- .PP
- .I Troff
- produces its output in a device-independent form,
- although parameterized for a specific device;
- \*(TR output must be processed by a driver for that
- device to produce printed output.
- .PP
- \*(Tr and \*(NR are highly compatible with each other and it is almost always
- possible to prepare input acceptable to both.
- Conditional input is provided to enable
- the user to embed input expressly destined for either program.
- \*(Nr can prepare output directly for a variety of terminal types and
- is capable of utilizing the full resolution of each terminal.
- \*(Nr is the same program as \*(TR; in fact, on Plan 9
- \*(NR is a shell script that calls \*(TR with the
- .CW -N
- argument.
- .SH
- Background to the Plan 9 Edition
- .PP
- The primary change to \*(TR and \*(NR for Plan 9 is
- support of the Unicode Standard, which was added during
- 1992 and 1993. There are two results. First, there is much
- less need for the myriad of two-character names that are so
- much a part of \*(TR lore; in Plan 9, for example, one naturally uses the
- Unicode character ½ instead of \*(TR\|'s
- .CW \\e(12 .
- Second, the output device, though called
- .CW utf ,
- is almost always a form of PostScript printer;
- the panoply of special drivers for different typesetters
- has largely disappeared.
- Unfortunately, not all PostScript printers can cope
- with Unicode characters, so there remains a need for
- programs that synthesize PostScript characters from bitmaps;
- this is especially true for Asian languages.
- .SH
- Background to the Second Edition
- .PP
- \*(Tr
- was originally written by the late Joe Ossanna
- in about 1973, in assembly language for the
- .UC PDP -11,
- to drive the Graphic Systems CAT typesetter.
- It was rewritten in C around 1975,
- and underwent slow but steady evolution until
- Ossanna's death late in 1977.
- .PP
- In 1979, Brian Kernighan
- modified
- \*(TR
- so that it would produce output for a variety of typesetters,
- while retaining its input specifications.
- Over the decade from 1979 to 1989,
- the internals
- have been modestly revised,
- though much of the code remains as it was when Ossanna wrote it.
- .PP
- \*(Tr
- reads parameter files
- each time it is invoked, to
- set values for machine resolution,
- legal type sizes and fonts, and character names,
- character widths
- and the like.
- \*(Tr
- output is
- .UC ASCII
- characters
- in a simple language
- that describes where each character is to be placed
- and in what size and font.
- A post-processor must be written for each device
- to convert this typesetter-independent language
- into specific instructions for that device.
- .PP
- The output language contains information that was not readily
- identifiable in the older output.
- In the newer language, the beginning of each page, line, and word
- is marked,
- so post-processors can do device-specific optimizations
- such as sorting the data vertically or printing it boustrophedonically,
- independent of
- \*(TR.
- .PP
- Capabilities for graphics have been added:
- \*(TR
- recognizes commands for drawing diagonal lines,
- circles, ellipses, circular arcs,
- and quadratic B-splines.
- There are also ways to pass arbitrary information to the output,
- unprocessed by
- \*(TR.
- .PP
- A number of limitations have been eased or eliminated.
- A document may have an arbitrary number of fonts on any page
- (if the output device permits it, of course).
- Fonts may be accessed merely by naming them;
- ``mounting'' is no longer necessary.
- There are no limits on the number of characters.
- \H'8'Character height\H'10' and \S'-1'sl\S'0'a\S'1'nt\S'0' may be set
- independently of width.
- .PP
- The remainder of this document contains a description of
- usage and command-line options;
- a summary of requests, escape sequences, and pre-defined number registers;
- a reference manual;
- tutorial examples;
- and a list of commonly-available characters.
- .SH
- Acknowledgements
- .PP
- Joe Ossanna's
- \*(TR
- remains a remarkable accomplishment.
- For more than twenty years, it has proven a robust tool,
- taking unbelievable abuse from a variety of preprocessors
- and being forced into uses that were never conceived of
- in the original design,
- all with considerable grace under fire.
- .PP
- Recent versions of \*(TR have profited from
- significant code improvements by
- Jaap Akkerhuis, Dennis Ritchie, Ken Thompson, and Molly Wagner.
- UTF facilities owe much to Jaap Akkerhuis.
- Andrew Hume, Doug McIlroy, Peter Nelson and Ravi Sethi made valuable suggestions on the manual.
- I fear that the remaining bugs are my fault.
- .sp 100
- .BP
- .TL
- Usage
- .SP
- .PP
- \*(Tr or \*(NR is invoked as
- .P1
- troff \fIoptions files\fP
- nroff \fIoptions files\fP
- .P2
- where @options@ represents any of a number of option arguments
- and @files@ represents the list of files containing the document
- to be formatted.
- An argument consisting of a single minus
- .CW - ' `
- represents standard input.
- If no filenames are given input is taken from the standard input.
- The options, which may appear in any order so long as they appear
- before the files, are:
- .TS
- center;
- lfCW lw(4.5i).
- -m@name@ T{
- Read the macro file
- @cw /sys/lib/tmac. name@
- before the input @files@.
- T}
- -T@name@ T{
- Specifies
- the type of the output device.
- Specific devices are site-dependent.
- For
- \*(TR,
- the most useful name is
- .CW utf .
- For
- \*(NR,
- useful names include
- @cw "37"@ for the (default) Model 37 Teletype,
- @cw lp@ for ``dumb'' line printer terminals (no half-line motions,
- no reverse motions),
- and @cw think@ for the HP ThinkJet printer.
- T}
- -i T{
- Read standard input after the input files are exhausted.
- T}
- -o@list@ T{
- Print only pages whose page numbers appear in @list@,
- which consists of comma-separated numbers and number ranges.
- A number range has the form @N-M@
- and means pages @N@ through @M@;
- a initial @-N@ means
- from the beginning to page @N@; and a final @N-@ means
- from @N@ to the end.
- T}
- -n@N@ T{
- Number first generated page @N@.
- T}
- -r@aN@ T{
- Set number register @a@ (one-character) to @N@.
- T}
- -s@N@ T{
- Stop every @N@ pages.
- \*(Nr will halt prior to every @N@ pages (default @N=1@)
- to allow paper loading or
- changing, and will resume upon receipt of a newline.
- \*(Tr will include a ``pause'' code every @N@ pages;
- its meaning, if any, depends on the output device.
- T}
- -u@N@ T{
- Set amount of emboldening for the
- .CW bd
- request to @N@.
- T}
- -F@path@ T{
- Look in directory @path@ for font information;
- the defaults are
- .CW /sys/lib/troff/font
- and
- .CW /sys/lib/troff/term
- for \*(TR
- and \*(NR respectively.
- T}
- .sp .5
- T{
- \*(TR Only
- T}
- -a T{
- Send a printable approximation
- of the results to the standard output.
- T}
- .sp .5
- T{
- \*(NR Only
- T}
- -e T{
- Produce equally-spaced words in adjusted
- lines, using full terminal resolution.
- T}
- -h T{
- Use tabs instead of spaces
- to speed up printing.
- T}
- -q T{
- Invoke the simultaneous input-output mode of the @cw rd@ request.
- T}
- .TE
- .PP
- Each option is a separate argument;
- for example,
- .P1
- troff -Tutf -ms -mpictures -o4,6,8-10 \f2file1 file2\fP
- .P2
- requests formatting of pages 4, 6, and 8 through 10 of a document contained in the files
- named \f2file1\fP and \f2file2\fP,
- specifies the output in UTF,
- and invokes the macro packages
- .CW -ms
- and
- .CW -mpictures .
- .PP
- Various pre- and post-processors are available for use with \*(NR and \*(TR.
- These include the equation preprocessor
- .I eqn
- (for \*(TR only),
- the table-construction preprocessor
- .I tbl ,
- and
- .I pic
- and
- .I grap
- for various forms of graphics.
- .sp 100
- .BP
- .TL
- Request Summary
- .PP
- In the following table,
- the notation @+- N@ in the
- .BI "Request Form
- column means that the forms @N@, @+N@, or @-N@ are permitted,
- to set the parameter to @N@, increment it by @N@, or decrement it by @N@,
- respectively.
- Plain @N@ means that the value is used to set the parameter.
- .BI "Initial Values
- separated by
- .CW ;
- are for
- \*(TR
- and
- \*(NR
- respectively.
- In the
- .BI Notes
- column,
- .TS
- center;
- c lw(4.5i).
- B T{
- Request normally causes a break.
- The use of
- .CW ' \&
- as control character (instead of
- .CW . )\&
- suppresses the break function.
- T}
- D T{
- Mode or relevant parameters associated with current diversion level.
- T}
- E T{
- Relevant parameters are a part of the current environment.
- T}
- O T{
- Must stay in effect until logical output.
- T}
- P T{
- Mode must be still or again in effect at the time of physical output.
- T}
- T T{
- \*(TR only; no effect in \*(NR.
- T}
- @bold v@, @bold p@, @bold m@, @bold u@ T{
- Default scale indicator; if not specified, scale indicators are ignored.
- T}
- .TE
- .sp
- .tr &.
- .ps 9
- .vs 11
- .nr z 0 1
- .TS
- lf2 lf2 lf2 lf2 lf2
- lf2 lf2 lf2 lf2 lf2
- lfCW l l l l.
- Request Initial If No
- Form Value Argument Notes Explanation
- .sp .5
- .T&
- lf3 s s s s.
- \\n+z. General Information
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Font and Character Size Control
- .sp .5
- &ps @+- N@ 10 point previous E,T Point size; also @cw "\es" +- N@.
- &ss @N@ 12/36\fBm\fP ignored E,T Space-character size set to @N/36@ em.
- &cs @ F~N~ M@ off - P,T Constant character space (width) mode (font @F@).
- &bd @F~N@ off - P,T Embolden font @F@ by @N-1@ units.
- &bd S@~F~N@ off - P,T Embolden Special Font when current font is @F@.
- &ft@~F@ Roman previous E Change to font @F@; also @cw "\ef" x@, @cw "\ef(" xx@, @cw "\ef" N@.
- &fp@~N~F~L@ R,I,B,...,S ignored - Mount font named @F@ on physical position @N <= 1@;
- long name is @L@ if given.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Page Control
- &pl @+- N@ 11i 11i @bold v@ Page length.
- &bp @+- N@ @N=1@ - B,@bold v@ Eject current page; next page number @N@.
- &pn @+- N@ @N=1@ ignored - Next page number @N@.
- &po @+- N@ 1i; 0 previous @bold v@ Page offset.
- &ne @N@ - @N=1 roman v@ D,@bold v@ Need @N@ vertical space.
- &mk @R@ none internal D Mark current vertical place in register @R@.
- &rt @+- N@ none internal D,@bold v@ Return (upward only) to marked vertical place.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Text Filling, Adjusting, and Centering
- &br - - B Break.
- &fi fill - B,E Fill output lines.
- &nf fill - B,E No filling or adjusting of output lines.
- &ad @c@ adj, both adjust E Adjust output lines with mode @c@; @c = cw l , cw r , cw c , cw b , none@
- &na adjust - E No output line adjusting.
- &ce @N@ off @N=1@ B,E Center next @N@ input text lines.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Vertical Spacing
- &vs @N@ 12p; 1/6i previous E,@bold p@ Vertical baseline spacing (@V@).
- &ls @N@ @N=1@ previous E Output @N-1@ @bold v@'s after each text output line.
- &sp @N@ - @N=1@v B,@bold v@ Space vertical distance @N@ in either direction.
- &sv @N@ - @N=1@v @bold v@ Save vertical distance @N@.
- &os - - - Output saved vertical distance.
- &ns space - D Turn no-space mode on.
- &rs - - D Restore spacing; turn no-space mode off.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Line Length and Indenting
- &ll @+- N@ 6.5i previous E,@bold m@ Line length.
- &in @+- N@ @N=0@ previous B,E,@bold m@ Indent.
- &ti @+- N@ - ignored B,E,@bold m@ Temporary indent.
- .sp .5
- .ne 2.1
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Macros, Strings, Diversion, and Position Traps
- &de @xx~yy@ - @.yy= cw ".."@ - Define or redefine macro @xx@; end at call of @yy@.
- &am @xx~yy@ - @.yy= cw ".."@ - Append to a macro.
- &ds @xx~string@ - ignored - Define a string @xx@ containing @string@.
- &as @xx~string@ - ignored - Append @string@ to string @xx@.
- &rm @xx@ - ignored - Remove request, macro, or string.
- &rn @xx~yy@ - ignored - Rename request, macro, or string @xx@ to @yy@.
- &di @xx@ - end D Divert output to macro @xx@.
- &da @xx@ - end D Divert and append to @xx@.
- &wh @N~xx@ - - @bold v@ Set location trap; negative is w.r.t. page bottom.
- &ch @xx~N@ - - @bold v@ Change trap location.
- &dt @N~xx@ - off D,@bold v@ Set a diversion trap.
- &it @N~xx@ - off E Set an input-line count trap.
- &em @xx@ none none - End macro is @xx@.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Number Registers
- &nr @R~+- N~M@ - @bold u@ Define and set number register @R@;
- auto-increment by @M@.
- &af @R~c@ arabic - - Assign format to register @R@ (@c= cw "1" , cw i , cw I , cw a , cw A@).
- &rr @R@ - - - Remove register @R@.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Tabs, Leaders, and Fields
- &ta@~Nt~. . .@ 0.5i; 0.8n none E,@bold m@ Tab settings; left-adjusting, unless
- @t= cw R@ (right), @cw C@ (centered).
- &tc@~c@ none none E Tab repetition character.
- &lc@~c@ @cw "."@ none E Leader repetition character.
- &fc@~a~b@ off off - Set field delimiter @a@ and pad character @b@.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Input and Output Conventions and Character Translations
- &ec@~c@ \e \e - Set escape character.
- &eo on - - Turn off escape character mechanism.
- &lg@~N@ on; - on T Ligature mode on if @N>0@.
- &ul@~N@ off @N=1@ E Underline (italicize in \*(TR\^) @N@ input lines.
- &cu@~N@ off @N=1@ E Continuous underline in \*(NR; in \*(TR, like @cw ul@.
- &uf@~F@ Italic Italic - Underline font set to @F@ (to be switched to by @cw ul@).
- &cc@~c@ @cw .@ @cw .@ E Set control character to @c@.
- &c2@~c@ @cw "'"@ @cw "'"@ E Set no-break control character to @c@.
- &tr@~abcd....@ none - O Translate @a@ to @b@, etc., on output.
- .sp .5
- .T&
- lf3 s s s s.
- \\n+z. Local Horizontal and Vertical Motions, and the Width Function
- .sp .5
- .T&
- lf3 s s s s.
- \\n+z. Overstrike, Bracket, Line-drawing, Graphics, and Zero-width Functions
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Hyphenation.
- &nh hyphenate - E No hyphenation.
- &hy@~N@ hyphenate hyphenate E Hyphenate; @N =@ mode.
- &hc@~c@ @cw "\e%"@ @cw "\e%"@ E Hyphenation indicator character @c@.
- &hw@~word~. . .@ ignored - Add words to hyphenation dictionary.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Three-Part Titles.
- &tl@~'l'c'r'@ - - Three-part title; delimiter may be any character.
- &pc@~c@ @cw %@ off - Page number character.
- <@~+- N@ 6.5i previous E,@bold m@ Length of title.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Output Line Numbering.
- &nm@~+- N^M^S^I@ off E Number mode on or off, set parameters.
- &nn@~N@ - @N=1@ E Do not number next @N@ lines.
- .sp .5
- .ne 2
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Conditional Acceptance of Input
- &if@~c~any@ - - If condition @c@ true, accept @any@ as input;
- for multi-line, use @cw "\e{" any cw "\e}"@.
- &if !@c~any@ - - If condition @c@ false, accept @any@.
- &if@~N~any@ - @bold u@ If expression @N > 0@, accept @any@.
- &if !@N~any@ - @bold u@ If expression @N <= 0@ [sic], accept @any@.
- &if@~ 's1 's2 '~any@ - - If string @s1@ identical to @s2@, accept @any@.
- &if !@ 's1 's2 '~any@ - - If string @s1@ not identical to @s2@, accept @any@.
- &ie@~c~any@ - @bold u@ If portion of if-else; all above forms (like @cw "if"@).
- &el@~any@ - - Else portion of if-else.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Environment Switching
- &ev@~N@ @N=0@ previous - Environment switch (push down).
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Insertions from the Standard Input
- &rd@~prompt@ - @prompt@=\s-1BEL\s+1 - Read insertion.
- &ex - - - Exit.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Input/Output File Switching
- &so@~filename@ - - Switch source file (push down).
- &nx@~filename@ end-of-file - Next file.
- &sy@~string@ - - Execute program @string@. Output not interpolated.
- &pi@~string@ - - Pipe output to program @string@.
- &cf@~filename@ - - Copy file contents to \*(TR output.
- .sp .5
- .T&
- lf3 s s s s
- lfCW l l l l.
- \\n+z. Miscellaneous
- &mc@~c~N@ - off E,@bold m@ Set margin character @c@ and separation @N@.
- &tm@~string@ - newline - Print @string@ on terminal (standard error).
- &ab@~string@ - newline - Print @string@ on standard error, exit program.
- &ig@~yy@ - @.yy= cw ".."@ - Ignore input until call of @yy@.
- &lf@~N ~f@ - - Set input line number to @N@ and filename to @f@.
- &pm@~t@ - all - Print macro names, sizes; if @t@ present, print total.
- &fl - - B Flush output buffer.
- .sp .5
- .T&
- lf3 s s s s.
- \\n+z. Output and Error Messages
- .sp .5
- \\n+z. Output Language
- .sp .5
- \\n+z. Device and Font Description Files
- .TE
- .br
- .nr zz 9
- .de cl
- .ie \\n+(cl<\n(zz \{\
- . po +\\n(.lu/\n(zzu
- . rt\}
- .el \{.po 1i\}
- ..
- .nr cl 0 1
- .di zz
- .ta .45iR
- ... was .35
- .nf
- .ps 9
- .vs 10.5
- \f(CWab\fP 20
- \f(CWad\fP 4
- \f(CWaf\fP 8
- \f(CWam\fP 7
- \f(CWas\fP 7
- \f(CWbd\fP 2
- \f(CWbp\fP 3
- \f(CWbr\fP 4
- \f(CWc2\fP 10
- \f(CWcc\fP 10
- \f(CWce\fP 4
- \f(CWcf\fP 19
- \f(CWch\fP 7
- \f(CWcs\fP 2
- \f(CWcu\fP 10
- \f(CWda\fP 7
- \f(CWde\fP 7
- \f(CWdi\fP 7
- \f(CWds\fP 7
- \f(CWdt\fP 7
- \f(CWec\fP 10
- \f(CWel\fP 16
- \f(CWem\fP 7
- \f(CWeo\fP 10
- \f(CWev\fP 17
- \f(CWex\fP 18
- \f(CWfc\fP 9
- \f(CWfi\fP 4
- \f(CWfl\fP 20
- \f(CWfp\fP 2
- \f(CWft\fP 2
- \f(CWhc\fP 13
- \f(CWhw\fP 13
- \f(CWhy\fP 13
- \f(CWie\fP 16
- \f(CWif\fP 16
- \f(CWig\fP 20
- \f(CWin\fP 6
- \f(CWit\fP 7
- \f(CWlc\fP 9
- \f(CWlg\fP 10
- \f(CWlf\fP 20
- \f(CWll\fP 6
- \f(CWls\fP 5
- \f(CWlt\fP 14
- \f(CWmc\fP 20
- \f(CWmk\fP 3
- \f(CWna\fP 4
- \f(CWne\fP 3
- \f(CWnf\fP 4
- \f(CWnh\fP 13
- \f(CWnm\fP 15
- \f(CWnn\fP 15
- \f(CWnr\fP 8
- \f(CWns\fP 5
- \f(CWnx\fP 19
- \f(CWos\fP 5
- \f(CWpc\fP 14
- \f(CWpi\fP 19
- \f(CWpl\fP 3
- \f(CWpm\fP 20
- \f(CWpn\fP 3
- \f(CWpo\fP 3
- \f(CWps\fP 2
- \f(CWrd\fP 18
- \f(CWrm\fP 7
- \f(CWrn\fP 7
- \f(CWrr\fP 8
- \f(CWrs\fP 5
- \f(CWrt\fP 3
- \f(CWso\fP 19
- \f(CWsp\fP 5
- \f(CWss\fP 2
- \f(CWsv\fP 5
- \f(CWsy\fP 19
- \f(CWta\fP 9
- \f(CWtc\fP 9
- \f(CWti\fP 6
- \f(CWtl\fP 14
- \f(CWtm\fP 20
- \f(CWtr\fP 10
- \f(CWuf\fP 10
- \f(CWul\fP 10
- \f(CWvs\fP 5
- \f(CWwh\fP 7
- .di
- .nr aa \n(dn/\n(zz
- .ne \\n(aau+10p
- .sp
- .SP 2
- .TL
- Alphabetical Request and Section Number Cross Reference
- .SP .5
- .LP
- .sp .5
- .nf
- .wh \n(nlu+\n(aau cl
- .nr qq \n(nlu+\n(aau
- .ps
- .vs
- .mk
- .zz
- .rt
- .sp \n(.tu
- .ch cl 12i
- .sp 100
- .BP
- .TL
- Escape Sequences for Characters, Indicators, and Functions
- .SP .5
- .LP
- .ps -1
- .vs -1
- .TS
- center;
- c2 l
- c2 l2 l
- n2 l2fCW l.
- .ft 4
- Section Escape
- Reference Sequence Meaning
- .ft
- .sp .5
- 10.1 \e\e \&\f(CW\e\fP prevents or delays the interpretation of \&\f(CW\e\fP
- 10.1 \ee Printable version of the current escape character.
- 2.1 \e' \' (acute accent); equivalent to \&\f(CW\e(aa\fP
- 2.1 \e` \` (grave accent); equivalent to \&\f(CW\e(ga\fP
- 2.1 \e\- \- Minus sign in the current font
- 7. \e\^. Period (dot) (see \&\f(CWde\fP)
- 11.1 \e\f2space\fP Unpaddable space-size space character
- 11.1 \e0 Digit width space
- 11.1 \e| 1/6 em narrow space character (zero width in \*(NR\^)
- 11.1 \e^ 1/12 em half-narrow space character (zero width in \*(NR\^)
- .tr &&
- 4.1 \e& Non-printing, zero width character
- .tr &.
- 10.6 \e! Transparent line indicator
- 10.8 \e" Beginning of comment; continues to end of line
- 13. \e% Default optional hyphenation character
- 2.1 \e(@xx@ Character named @xx@
- 7.1 \e*@x,~@\e*(@xx@ Interpolate string @x@ or @xx@
- 7.3 \e$@N@ Interpolate argument @1 <= N <= 9@
- 9.1 \ea Non-interpreted leader character
- 12.3 \eb'@abc...@' Bracket building function
- 4.2 \ec Connect to next input text
- 2.1 \eC'@xyz@' Character named @xyz@
- 11.1 \ed Downward 1/2 em vertical motion (1/2 line in \*(NR\^)
- 12.5 \eD'@c...@' Draw graphics function @c@ with parameters @. . .@; @c= cw l , cw c , cw e , cw a , cw "~"@
- 2.2 \ef@x,~@\ef(@xx,~@\ef@N@ Change to font named @x@ or @xx@, or position @N@
- 8. \eg@x,~@\eg(@xx@ Format of number register @x@ or @xx@
- 11.1 \eh'@N@' Local horizontal motion; move right @N@ (negative left)
- 2.3 \eH'@N@' Height of current font is @N@
- 11.3 \ek@x@ Mark horizontal input place in register @x@
- 12.4 \el'@Nc@' Horizontal line drawing function (optionally with @c@ )
- 12.4 \eL'@Nc@' Vertical line drawing function (optionally with @c@ )
- 8. \en@x,~@\en(@xx@ Contents of number register @x@ or @xx@
- 2.1 \eN'@N@' Character number @N@ on current font
- 12.1 \eo'@abc...@' Overstrike characters @a,~ b,~ c@, ...
- 4.1 \ep Break and spread output line
- 11.1 \er Reverse 1 em vertical motion (reverse line in \*(NR\^)
- 2.3 \es@N,~@\es@+- N@ Point-size change function; also @cw "\es(" nn@, @cw "\es" +- cw "(" nn@
- 2.2 \eS'@N@' Slant output @N@ degrees
- 9.1 \et Non-interpreted horizontal tab
- 11.1 \eu Reverse (up) 1/2 em vertical motion (1/2 line in \*(NR\^)
- 11.1 \ev'@N@' Local vertical motion; move down N (negative up)
- 11.2 \ew'@string@' Width of @string@
- 5.2 \ex'@N@' Extra line-space function (negative before, positive after)
- 10.7 \eX'@string@' Output @string@ as device control function
- 12.2 \ez@c@ Print @c@ with zero width (without spacing)
- 16. \e{ Begin conditional input
- 16. \e} End conditional input
- 10.8 \e@newline@ Concealed (ignored) newline
- - \e@Z@ @Z@, any character not listed above
- .TE
- .ps +1
- .vs +1
- .LP
- The escape sequences
- .CW \e\e ,
- .CW \e\^. ,
- .CW \e" ,
- .CW \e$ ,
- .CW \e* ,
- .CW \ea ,
- .CW \en ,
- .CW \et ,
- .CW \eg ,
- and
- .CW \e@newline@
- are interpreted in copy mode (§7.2).
- .SP .5i
- \0
- .sp 100
- .BP
- .TL
- Predefined Number Registers
- .LP
- .ps -1
- .vs -1
- .TS
- c2l
- c2 l2 l
- n2 l2fCW l.
- .ft 4
- Section Register
- Reference Name Description
- .ft
- .sp .5
- 3. % Current page number.
- 11.2 ct Character type (set by \&\f(CW\ew\fP function).
- 7.4 dl Width (maximum) of last completed diversion.
- 7.4 dn Height (vertical size) of last completed diversion.
- - dw Current day of the week (1-7).
- - dy Current day of the month (1-31).
- 15. ln Output line number.
- - mo Current month (1-12).
- 4.1 nl Vertical position of last printed text baseline.
- 11.2 sb Depth of string below baseline (generated by \&\f(CW\ew\fP function).
- 11.2 st Height of string above baseline (generated by \&\f(CW\ew\fP function).
- - yr Last two digits of current year.
- .TE
- .ps +1
- .vs +1
- .TL
- Predefined Read-Only Number Registers
- .LP
- .ps -1
- .vs -1
- .TS
- c2 l
- c2 l2 l
- n2 l2fCW l.
- .ft 4
- Section Register
- Reference Name Description
- .ft
- .sp .5
- 19. $$ Process id of \*(TR or \*(NR.
- 7.3 &$ Number of arguments available at the current macro level.
- 5.2 &a Post-line extra line-space most recently used in @cw "\ex'" N cw "'" @.
- - &A Set to 1 in \*(TR, if @cw -a@ option used; always 1 in \*(NR.
- 2.3 &b Emboldening level.
- 20. &c Number of lines read from current input file.
- 7.4 &d Current vertical place in current diversion; equal to @cw nl@, if no diversion.
- 2.2 &f Current font number.
- 20. &F Current input file name [sic].
- 4. &h Text baseline high-water mark on current page or diversion.
- 11.1 &H Available horizontal resolution in basic units.
- 6. &i Current indent.
- 4.2 &j Current @cw ad@ mode.
- 4.1 &k Current output horizontal position.
- 6. &l Current line length.
- 5.1 &L Current @cw ls@ value.
- 4. &n Length of text portion on previous output line.
- 3. &o Current page offset.
- 3. &p Current page length.
- 7.5 .R Number of unused number registers.
- - &T Set to 1 in \*(NR, if \&\f(CW-T\fP option used; always 0 in \*(TR.
- 2.3 &s Current point size.
- 7.5 &t Distance to the next trap.
- 4.1 &u Equal to 1 in fill mode and 0 in nofill mode.
- 5.1 &v Current vertical line spacing.
- 11.1 &V Available vertical resolution in basic units.
- 11.2 &w Width of previous character.
- - &x Reserved version-dependent register.
- - &y Reserved version-dependent register.
- 7.4 &z Name [sic] of current diversion.
- .TE
- .ps +1
- .vs +1
- .sp 100
- .BP
- .TL
- Reference Manual
- .NH
- General Explanation
- .sc "Form of input.
- Input consists of \fItext lines\fR, which are destined to be printed,
- interspersed with \fIcontrol lines\fR,
- which set parameters or otherwise control subsequent processing.
- Control lines begin with a \fIcontrol character\fR\(em\
- normally \&\f(CW.\fR (period) or \&\f(CW'\fR (single quote)\(em\
- followed by a one or two character name that specifies
- a basic \fIrequest\fR or the substitution of
- a user-defined \fImacro\fR in place of the control line.
- The control character \&\f(CW'\fR suppresses the \fIbreak\fR function\(em\
- the forced output of a partially filled line\(em\
- caused by certain requests.
- The control character may be separated from the request/macro name by
- white space (spaces and/or tabs) for aesthetic reasons.
- Names should be followed by either
- space or newline.
- Control lines with unrecognized names are ignored.
- .PP
- Various special functions may be introduced anywhere in the input by
- means of an \fIescape\fR character, normally \&\f(CW\e\fR.
- For example, the function
- .CW \en@R@
- causes the interpolation of the contents of the
- \fInumber register R\fR
- in place of the function;
- here @R@ is either a single character name
- as in \&\f(CW\en\fIx\fR,
- or a two-character name introduced by
- a left-parenthesis, as in \&\f(CW\en(\fIxx\fR.
- .sc "Formatter and device resolution.
- \*(Tr internally stores and processes dimensions in units that correspond to
- the particular device for which output is being prepared;
- values from 300 to 1200/inch are typical.
- See §23.
- \*(Nr internally uses 240 units/inch,
- corresponding to the least common multiple of the
- horizontal and vertical resolutions of various
- typewriter-like output devices.
- \*(Tr rounds horizontal/vertical numerical parameter input to the actual
- horizontal/vertical resolution of the output device indicated by the \&\f(CW-T\fR option
- (default
- .CW post ).
- \*(Nr similarly rounds numerical input to the actual resolution
- of its output device
- (default Model 37 Teletype).
- .sc "Numerical parameter input.
- Both \*(NR and \*(TR
- accept numerical input with the appended scale
- indicators
- shown in the following table,
- where
- \fIS\fR is the current type size in points and
- \fIV\fR is the current vertical line spacing in
- basic units.
- .TS
- center box;
- c|c
- c|c
- c|l.
- Scale
- Indicator Meaning
- _
- \&\f(CWi\fR Inch
- \&\f(CWc\fR Centimeter
- \&\f(CWP\fR Pica = 1/6 inch
- \&\f(CWm\fR Em = \fIS\fR points
- \&\f(CWn\fR En = Em/2
- \&\f(CWp\fR Point = 1/72 inch
- \&\f(CWu\fR Basic unit
- \&\f(CWv\fR Vertical line space \fIV\fR
- none Default, see below
- .TE
- In \*(NR, both the em and the en are taken to be equal to the
- nominal character width,
- which is output-device dependent;
- common values are 1/10 and 1/12 inch.
- Actual character widths in \*(NR need not be all the same and constructed characters
- such as -> (→) are often extra wide.
- The default scaling is
- .CW m
- for the horizontally-oriented requests
- and functions
- .CW ll ,
- .CW in ,
- .CW ti ,
- .CW ta ,
- .CW lt ,
- .CW po ,
- .CW mc ,
- .CW \eh ,
- .CW \el ,
- and horizontal coordinates of
- .CW \eD ;
- .CW v
- for the vertically-oriented requests and functions
- .CW pl ,
- .CW wh ,
- .CW ch ,
- .CW dt ,
- .CW sp ,
- .CW sv ,
- .CW ne ,
- .CW rt ,
- .CW \ev ,
- .CW \ex ,
- .CW \eL ,
- and vertical coordinates of
- .CW \eD ;
- .CW p
- for the
- .CW vs
- request;
- and
- .CW u
- for the requests
- .CW nr ,
- .CW if ,
- and
- .CW ie .
- \fIAll\fR other requests ignore any scale indicators.
- When a number register containing an already appropriately scaled number
- is interpolated to provide numerical input,
- the unit scale indicator
- \&\f(CWu\fR may need to be appended to prevent
- an additional inappropriate default scaling.
- The number, @N@, may be specified in decimal-fraction form
- but the parameter finally stored is rounded to an integer number of basic units.
- Internal computations are performed in integer arithmetic.
- .PP
- The \fIabsolute position\fR indicator \&\f(CW|\fR may be prefixed
- to a number @N@
- to generate the distance to the vertical or horizontal place @N@.
- For vertically-oriented requests and functions, \&\f(CW|\fP@N@
- becomes the distance in basic units from the current vertical place on the page or in a \fIdiversion\fR (§7.4)
- to the vertical place @N@.
- For \fIall\fR other requests and functions,
- \&\f(CW|\fP@N@
- becomes the distance from
- the current horizontal place on the \fIinput\fR line to the horizontal place @N@.
- For example,
- .P1
- \&.sp |3.2c
- .P2
- will space in the required direction to 3.2 centimeters from the top of the page.
- .sc "Numerical expressions.
- .tr &&
- Wherever numerical input is expected,
- an expression involving parentheses,
- the arithmetic operators \&\f(CW+\fR, \&\f(CW-\fR, \&\f(CW/\fR, \&\f(CW\(**\fR, \&\f(CW%\fR (mod),
- and the logical operators
- \&\f(CW<\fR,
- \&\f(CW>\fR,
- \&\f(CW<=\fR,
- \&\f(CW>=\fR,
- \&\f(CW=\fR (or \&\f(CW==\fR),
- \&\f(CW&\fR\ (and),
- \&\f(CW:\fR\ (or)
- may be used.
- Except where controlled by parentheses, evaluation of expressions is left-to-right;
- there is no operator precedence.
- In the case of certain requests, an initial \&\f(CW+\fR or \&\f(CW-\fR is stripped
- and interpreted as an increment or decrement indicator respectively.
- In the presence of default scaling, the desired scale indicator must be
- attached to \fIevery\fR number in an expression
- for which the desired and default scaling differ.
- For example,
- if the number register \&\f(CWx\fR contains 2
- and the current point size is 10,
- then
- .P1
- \&.ll (4.25i+\enxP+3)/2u
- .P2
- will set the line length to 1/2 the sum of 4.25 inches + 2 picas + 3 ems.
- .sc "Notation.
- Numerical parameters are indicated in this manual in two ways.
- @+- N@ means that the argument may take the forms @N@, @+N@, or @-N@ and
- that the corresponding effect is to set the parameter
- to @N@, to increment it by @N@, or to decrement it by @N@ respectively.
- Plain @N@ means that an initial algebraic sign is \fInot\fR
- an increment indicator,
- but merely the sign of @N@.
- Generally, unreasonable numerical input is either ignored
- or truncated to a reasonable value.
- For example,
- most requests expect to set parameters to non-negative
- values;
- exceptions are
- .CW sp ,
- .CW wh ,
- .CW ch ,
- .CW nr ,
- and
- .CW if .
- The requests
- .CW ps ,
- .CW ft ,
- .CW po ,
- .CW vs ,
- .CW ls ,
- .CW ll ,
- .CW in ,
- and
- .CW lt
- restore the previous parameter value in the absence
- of an argument.
- .PP
- Single character arguments are indicated by single lower case letters
- and
- one/two character arguments are indicated by a pair of lower case letters.
- Character string arguments are indicated by multi-character mnemonics.
- .NH
- Font and Character Size Control
- .sc "Character set.
- The \*(TR character set is defined by a description file specific to each output device (§23).
- There are normally several regular fonts and one or more special fonts.
- Characters are input as themselves,
- as @cw "\e(" xx@, as @cw "\eC'" name cw "'"@,
- or as
- .CW \eN'@n@' .
- The form
- .CW \eC'@name@'
- permits a name of any length;
- the form
- .CW \eN'@n@'
- refers to the @n@-th character on the current font,
- whether named or not.
- .PP
- Normally the input characters
- .CW ` ,
- .CW ' ,
- and
- .CW -
- are printed as `, ', and - respectively;
- .CW \e` ,
- .CW \e' ,
- and
- .CW \e-
- produce \`, \', and \-.
- If the character does not exist in the font, \*(TR assumes the width is 1 em and
- outputs the character with a
- .CW C
- name as defined in Section 22.
- (This is independent of how the device handles characters unknown to it.)
- .PP
- \*(Nr has an analogous, but different, mechanism for defining legal characters
- and how to print them.
- By default all characters are valid.
- There are such
- additional characters as may be available on
- the output device,
- such characters as may be constructed
- by overstriking or other combination,
- and those that can reasonably be mapped
- into other printable characters.
- The exact behavior is determined by a driving
- table prepared for each device.
- .sc "Fonts.
- \*(Tr
- begins execution by reading information for a set of defaults fonts,
- said to be
- .I mounted ;
- conventionally, the first four are
- Times Roman (\&\f(CWR\fR),
- Times Italic
- (\&\f(CWI\fR),
- Times Bold
- (\&\f(CWB\fR),
- and
- Times Bold Italic
- (\&\f(CWBI\fR) ,
- and the last is a Special font
- .CW S ) (
- containing miscellaneous characters.
- (This document uses Lucida Sans in place of Times.)
- The set of fonts and positions is determined by the device description file,
- described in §23.
- .PP
- The current font, initially Roman, may be changed
- by the \&\f(CWft\fR request,
- or by embedding at any desired point
- \&\f(CW\ef\fIx\fR, \&\f(CW\ef(\fIxx\fR, or \&\f(CW\ef\fP@N@,
- where
- \fIx\fR and \fIxx\fR are the name of a font
- and @N@ is a numerical font position.
- .PP
- It is not necessary to change to the Special font;
- characters on that font are automatically handled
- as if they were physically part of the current font.
- The Special font may actually be several fonts;
- the name
- .CW S
- is reserved and is generally used for one of these.
- All special fonts must be mounted after regular fonts.
- .PP
- \*(Tr can be informed that any particular font is mounted
- by use of the \&\f(CWfp\fR request.
- The list of known fonts is installation dependent.
- In the subsequent discussion of font-related requests,
- @F@ represents either a one/two-character
- font name or the numerical font position.
- The current font is available (as a numerical position) in the read-only number register \&\f(CW.f\fR.
- .PP
- A request for a named but not-mounted font is honored
- if the font description information exists.
- In this way, there is no limit on the number of fonts that may be printed
- in any part of a document.
- Mounted fonts may be handled more efficiently,
- and they may be referred to by their mount positions,
- but there is no other difference.
- Mention of an unmounted font loads it temporarily at font position
- zero, which serves as a one-font cache.
- .PP
- The function
- .CW \eS'@+- N@'
- causes the current font to be slanted by
- @+- N@
- degrees.
- Not all devices support slanting.
- .PP
- \*(Nr understands font control
- and normally underlines italic characters (see §10.5).
- .sc "Character size.
- Character point sizes available depend on the specific output device;
- a typical (historical) set of values is
- 6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, and 36.
- This is a range of 1/12 inch to 1/2 inch.
- The \&\f(CWps\fR request is used to change or restore the point size.
- Alternatively the point size may be changed between any two characters
- by embedding a
- .CW \es@N@
- at the desired point
- to set the size to @N@,
- or a
- .CW "\&\f(CW\es@+- N@
- (@1 <= N <= 9@)
- to increment/decrement the size by @N@;
- .CW \es0
- restores the previous size.
- Requested point size values that are between two valid
- sizes yield the larger of the two.
- .PP
- Note that through an accident of history, a construction like
- .CW \es39
- is parsed as size 39, and thus converted to size 36 (given the sizes above),
- while
- .CW \es40
- is parsed as size 4 followed by
- .CW 0 .
- The forms
- @cw "\es(" nn@ and @cw "\es" +- cw "(" nn@
- permit specification of sizes that would otherwise be ambiguous.
- .PP
- The current size is available in the \&\f(CW.s\fR register.
- \*(Nr ignores type size requests.
- .PP
- The function
- .CW "\eH'@+- N@'
- sets \H'+2'the height of the current font\H'0' to
- @N@, or increments it by @+N@, or decrements it by @-N@;
- if @N=0@, the height is restored to the current point size.
- In each case, the width is unchanged.
- Not all devices support independent height and width for characters.
- .FS
- *The fields have the same meaning as described earlier in the Request Summary.
- .FE
- .SP .5
- .LP
- .ne 2.1
- .ta 1.5i 2.5i 3.5i 4.5i
- \f2Request\fR \f2Initial\fR \f2If\ No\fR
- .br
- \f2Form\fR \f2Value\fR \f2Argument\fR \f2Notes\fR
- .bt "\&\f(CW.ps\fI \(+-N\fR*" "10\|point" "previous" "E" "Point size
- set to @+- N@.
- Alternatively, embed
- .CW \es@N@
- or
- .CW "\&\f(CW\es@+- N@" .
- Any positive size value may be requested;
- if invalid, the next larger valid size will result, with a
- maximum of 36.
- A paired sequence
- @+N@, @-N@
- will work because the previous requested value is also remembered.
- Ignored in \*(NR.
- .bt "\&\f(CW.ss\fI N\fR" "12/36\|em" "ignored" "E" "Space-character size
- (i.e., inter-word gap)
- is set to @N@/36 ems.
- This size is the minimum word spacing in adjusted text.
- Ignored in \*(NR.
- .bt "\&\f(CW.cs\fI\|F\|N\|M\fR" "off" "-" "P" "Constant character space
- (width) mode is
- set on for font @F@ (if mounted); the width of every character will be
- taken to be @N@/36 ems.
- If @M@ is absent,
- the em is that of the character's point size;
- if @M@ is given,
- the em is @M@ points.
- All affected characters
- are centered in this space, including those with an actual width
- larger than this space.
- Special Font characters occurring while the current font
- is @F@ are also so treated.
- If @N@ is absent, the mode is turned off.
- The mode must be in effect when the characters are physically printed.
- Ignored in \*(NR.
- .bt "\&\f(CW.bd\fI F N\fR" "off" "-" "P" "The characters in font @F@ will be artificially
- emboldened by printing each one twice, separated by @N-1@ basic units.
- A reasonable value for @N@ is 3 when the character size is near 10 points.
- If @N@ is missing the embolden mode is turned off.
- The emboldening value @N@ is in the \&\f(CW.b\fP register.
- .IP
- .bd R 3
- This paragraph is printed with \&\f(CW.bd R 3\fR.
- The mode must be in effect when the characters are physically printed.
- Ignored in \*(NR.
- .br
- .bd R
- .bt "\&\f(CW.bd S \fIF N\fR" "off" "-" "P" "The characters in the Special font
- will be emboldened whenever the current font is @F@.
- The mode must be in effect when the characters are physically printed.
- Ignored in \*(NR.
- .bt "\&\f(CW.ft\fP @F@" "Roman" "previous" "E" "Font changed to
- @F@.
- Alternatively, embed
- .CW \ef@F@ .
- The font name \&\f(CWP\fR is reserved to mean the previous font,
- and the name
- .CW S
- for the special font.
- .bt "\&\f(CW.fp \fIN F L\fR" "R,I,B,...,S" "ignored" "-" "Font position.
- This is a statement
- that a font named @F@ is associated with position @N@.
- It is a fatal error if @F@ is not known.
- For fonts with names longer than two characters,
- .I L
- refers to the long name,
- and
- .I F
- becomes a synonym.
- There is generally a limit of about 10 mounted fonts.
- .NH
- Page control
- .PP
- Top and bottom margins are not automatically provided;
- it is conventional to define two \fImacros\fR and to set \fItraps\fR
- for them at vertical positions 0 (top) and @-N@ (distance @N@ up from the bottom).
- See §7 and Tutorial Examples §T2.
- A pseudo-page transition onto the first page occurs
- either when the first \fIbreak\fR occurs or
- when the first \fInon-diverted\fR text processing occurs.
- Arrangements
- for a trap to occur at the top of the first page
- must be completed before this transition.
- In the following, references to the \fIcurrent diversion\fR (§7.4)
- mean that the mechanism being described works during both
- ordinary and diverted output (the former considered as the top diversion level).
- .PP
- The limitations on \*(TR and \*(NR output dimensions
- are device dependent.
- .bt "\&\f(CW.pl\fI \(+-N\fR" "11\|in" "11\|in" "\fBv\fR" "Page length set to @+- N@.
- The current page length is available in the \&\f(CW.p\fR register.
- .bt "\&\f(CW.bp\fI \(+-N\fR" "\fIN\(eq\fR1" "-" "B,\fBv\fR" "Begin page.
- The current page is ejected and a new page is begun.
- If @+- N@ is given, the new page number will be @+- N@.
- Also see request \&\f(CWns\fR.
- .bt "\&\f(CW.pn\fI \(+-N\fR" "@N@\(eq1" "ignored" "-" "Page number.
- The next page (when it occurs) will have the page number @+- N@.
- A \&\f(CWpn\fR must occur before the initial pseudo-page transition
- to affect the page number of the first page.
- The current page number is in the \&\f(CW%\fR register.
- .bt "\&\f(CW.po\fI \(+-N\fR" "1\|in; 0" "previous" "\fBv\fR" "Page offset.
- The current \fIleft margin\fR is set to @+- N@.
- The \*(TR initial value provides 1 inch of paper margin
- on a typical device.
- The current page offset is available in the \&\f(CW.o\fR register.
- .bt "\&\f(CW.ne\fI N\fR" "-" "\fIN\(eq\fR1\|\fIV\fR" "D,\fBv\fR" "Need @N@ vertical space.
- If the distance \fID\fR to the next trap position (see §7.5) is less than @N@,
- a forward vertical space of size \fID\fR occurs,
- which will spring the trap.
- If there are no remaining
- traps on the page,
- \fID\fR is the distance to the bottom of the page.
- If @D<V@, another line could still be output
- and spring the trap.
- In a diversion, \fID\fR is the distance to the \fIdiversion trap\fR, if any,
- or is very large.
- .bt "\&\f(CW.mk\fI R\fR" "none" "internal" "D" "Mark the current vertical place
- in an internal register (both associated with the current diversion level),
- or in register @R@, if given.
- See \&\f(CWrt\fR request.
- .bt "\&\f(CW.rt\fI \(+-N\fR" "none" "internal" "D,\fBv\fR" "Return \fIupward only\fR to a marked vertical place
- in the current diversion.
- If @+- N@ (with respect to current place) is given,
- the place is @+- N@ from the top of the page or diversion
- or, if @N@ is absent, to a
- place marked by a previous \&\f(CWmk\fR.
- The \&\f(CWsp\fR request (§5.3) may be used
- instead of \&\f(CWrt\fR
- by spacing to the absolute place stored in a explicit register,
- e.g., using
- .CW ".mk
- @R@ ...\&
- .CW ".sp
- .CW |\en@R@u ;
- this also works when the motion is downwards.
- .NH
- Text Filling, Adjusting, and Centering
- .sc "Filling and adjusting.
- Normally,
- words are collected from input text lines
- and assembled into a output text line
- until some word does not fit.
- An attempt is then made
- to hyphenate the word to put part
- of it into the output line.
- The spaces between the words on the output line
- are then increased to spread out the line
- to the current \fIline length\fR
- minus any current \fIindent\fR.
- A \fIword\fR is any string of characters delimited by
- the \fIspace\fR character or the beginning/end of the input line.
- Any adjacent pair of words that must be kept together
- (neither split across output lines nor spread apart
- in the adjustment process)
- can be tied together by separating them with the
- \fIunpaddable space\fR character
- ``\&\f(CW\e\ \fR'' (backslash-space).
- The adjusted word spacings are uniform in \*(TR
- and the minimum interword spacing can be controlled
- with the \&\f(CWss\fR request (§2).
- In \*(NR, they are normally nonuniform because of
- quantization to character-size spaces;
- however,
- the command line option \&\f(CW-e\fR causes uniform
- spacing with full output device resolution.
- Filling, adjustment, and hyphenation (§13) can all be
- prevented or controlled.
- The text length on the last line output is available in the \&\f(CW.n\fR register,
- and text baseline position on the page for this line is in the \&\f(CWnl\fR register.
- The text baseline high-water mark (lowest place) on the current page is in
- the \&\f(CW.h\fR register.
- The current horizontal output position is in the \&\f(CW.k\fP register.
- .PP
- An input text line
- .I ending
- with \&\f(CW.\fR\^, \&\f(CW?\fR, or \&\f(CW!\fR,
- optionally followed by any number of
- .CW \&" ,
- .CW ' ,
- .CW ) ,
- .CW ] ,
- .CW * ,
- or
- †,
- is taken
- to be the end of a sentence, and an additional space character is
- automatically provided during filling.
- To prevent this, add
- .CW \e&
- to the end of the input line.
- Multiple inter-word space characters found in the input are retained,
- except for trailing spaces;
- initial spaces also cause a break.
- .PP
- When filling is in effect, a \&\f(CW\ep\fR may be embedded or attached to a word to
- cause a break at the end of the word and have the resulting output
- line spread out to fill the current line length.
- .PP
- .tr &&
- A text input line that happens to begin
- with a control character can
- be made not to look like a control line
- by prefixing it with
- the non-printing, zero-width filler character \&\f(CW\e&\fR.
- Still another way is to specify output translation of some
- convenient character into the control character
- using \&\f(CWtr\fR (§10.5).
- .tr &.
- .sc "Interrupted text.
- The copying of a input line in \fInofill\f (non-fill) mode can be interrupted
- by terminating
- the partial line with a \&\f(CW\ec\fR.
- The next encountered input text line will be considered to be a continuation
- of the same line of input text.
- Similarly,
- a word within \fIfilled\fR text may be interrupted by terminating the
- word (and line) with \&\f(CW\ec\fR;
- the next encountered text will be taken as a continuation of the
- interrupted word.
- If the intervening control lines cause a break,
- any partial line will be forced out along with any partial word.
- .bt "\&\f(CW.br\fR" "-" "-" "B" "Break.
- The filling of the line currently
- being collected is stopped and
- the line is output without adjustment.
- Text lines beginning with space characters
- (but not tabs)
- and empty text lines (blank lines) also cause a break.
- .bt "\&\f(CW.fi\fR" "fill on" - B,E "Fill subsequent output lines.
- The register \&\f(CW.u\fR is 1 in fill mode and 0 in nofill mode.
- .bt "\&\f(CW.nf\fR" "fill on" "-" "B,E" "Nofill.
- Subsequent output lines are neither filled nor adjusted.
- Input text lines are copied directly to output lines
- without regard for the current line length.
- .bt "\&\f(CW.ad\fI c\fR" "adj, both" "adjust" "E" "Line adjustment is begun.
- If fill mode is not on, adjustment will be deferred until
- fill mode is back on.
- If the type indicator @c@ is present,
- the adjustment type is changed as shown in the following table.
- .TS
- center box;
- c|c
- c|l.
- Indicator Adjust Type
- _
- \&\f(CWl\fR adjust left margin only
- \&\f(CWr\fR adjust right margin only
- \&\f(CWc\fR center
- \&\f(CWb\fR or \&\f(CWn\fR adjust both margins
- absent unchanged
- .TE
- The number register
- .CW .j
- contains the current value of the
- .CW ad
- setting;
- its value can be recorded and used subsequently to set adjustment.
- .bt "\&\f(CW.na\fR" "adjust" "-" "E" "Noadjust.
- Adjustment is turned off;
- the right margin will be ragged.
- The adjustment type for \&\f(CWad\fR is not changed.
- Output line filling still occurs if fill mode is on.
- .bt "\&\f(CW.ce\fI N\fR" "off" "@N=1@" "B,E" "Center the next @N@ input text lines
- within the current available horizontal space (line-length minus indent).
- If @N=0@, any residual count is cleared.
- A break occurs after each of the @N@ input lines.
- If the input line is too long,
- it will be left adjusted.
- .NH
- Vertical Spacing
- .sc "Baseline spacing.
- The vertical spacing @(V)@ between the baselines of successive
- output lines can be set
- using the \&\f(CWvs\fR request.
- \fIV\fR should be large enough to accommodate the character sizes
- on the affected output lines.
- For the common type sizes (9-12 points),
- usual typesetting practice is to set \fIV\fR to 2 points greater than the
- point size;
- \*(TR default is 10-point type on a 12-point spacing
- (as in this document).
- The current \fIV\fR is available in the \&\f(CW.v\fR register.
- Multiple-\fIV\|\fR line separation (e.g., double spacing) may be requested
- with \&\f(CWls\fR,
- but it is better to use a large
- .CW vs
- instead;
- certain preprocessors assume single spacing.
- The current line spacing is available in the \&\f(CW.L\fP register.
- .sc "Extra line-space.
- If a word contains a tall construct requiring
- the output line containing it to have extra vertical space
- before and/or after it,
- the \fIextra-line-space\fR function \&\f(CW\ex'\fIN\fP'\fR
- can be embedded in or attached to that word.
- If @N@ is negative,
- the output line containing the word will
- be preceded by @N@ extra vertical space;
- if @N@ is positive,
- the output line containing the word
- will be followed by @N@ extra vertical space.
- If successive requests for extra space apply to the same line,
- the maximum values are used.
- The most recently utilized post-line extra line-space is available in the \&\f(CW.a\fR register.
- .PP
- In
- .CW \ex'\f2...\fP'
- and other functions having a pair of delimiters around
- their parameter,
- the delimiter choice (here
- .CW ' )
- is arbitrary,
- except that it can not look like the continuation of a number expression for @N@.
- .sc "Blocks of vertical space.
- A block of vertical space is ordinarily requested using \&\f(CWsp\fR,
- which honors the \fIno-space\fR mode and which does
- not space past a trap.
- A contiguous block of vertical space may be reserved using \&\f(CWsv\fR.
- .bt "\&\f(CW.vs \fIN\fR" "12pts; 1/6in" "previous" "E,\fBp\fR" "Set vertical baseline spacing size \fIV\fR.
- Transient extra vertical space is available with \&\f(CW\ex\fI'N\|'\fR (see above).
- .bt "\&\f(CW.ls \fIN\fR" "@N=1@" "previous" "E" "\fILine\fR spacing
- set to @+- N@.
- @N-1@ \fIV\fR\^s (blank lines) are
- appended to each output text line.
- Appended blank lines are omitted, if the text or previous appended blank line reached a trap position.
- .bt "\&\f(CW.sp \fIN\fR" "-" "@N=1~V@" "B,\fBv\fR" "Space vertically in either direction.
- If @N@ is negative, the motion is backward (upward)
- and is limited to the distance to the top of the page.
- Forward (downward) motion is truncated to the distance to the
- nearest trap.
- (Recall the use of
- .CW ".sp |\f2N\fP
- from §1.3.)
- If the no-space mode is on,
- no spacing occurs (see \&\f(CWns\fR and \&\f(CWrs\fR below).
- .bt "\&\f(CW.sv\fI N\fR" "-" "@N=1~V@" "\fBv\fR" "Save a contiguous vertical block of size @N@.
- If the distance to the next trap is greater
- than @N@, @N@ vertical space is output.
- No-space mode has no effect.
- If this distance is less than @N@,
- no vertical space is immediately output,
- but @N@ is remembered for later output (see \&\f(CWos\fR).
- Subsequent \&\f(CWsv\fR requests will overwrite any still remembered @N@.
- .bt "\&\f(CW.os\fR" "-" "-" "-" "Output saved vertical space.
- No-space mode has no effect.
- Used to finally output a block of vertical space requested
- by an earlier \&\f(CWsv\fR request.
- .bt "\&\f(CW.ns\fR" "space" "-" "D" "No-space mode turned on.
- When on, no-space mode inhibits \&\f(CWsp\fR requests and
- \&\f(CWbp\fR requests \fIwithout\fR a next page number.
- No-space mode is turned off when a line of
- output occurs, or with \&\f(CWrs\fR.
- .bt "\&\f(CW.rs\fR" "space" "-" "D" "Restore spacing.
- The no-space mode is turned off.
- .bt "\&Blank text line." "" "-" "B" "Causes a break and
- output of a blank line exactly like \&\f(CWsp 1\fR.
- .NH
- Line Length and Indenting
- .PP
- The maximum line length for fill mode may be set with \&\f(CWll\fR.
- The indent may be set with \&\f(CWin\fR;
- an indent applicable to only the next output line may be set with \&\f(CWti\fR.
- The line length includes indent space but not
- page offset space.
- The line length minus the indent is the basis for centering with \&\f(CWce\fR.
- The effect of \&\f(CWll\fR, \&\f(CWin\fR, or \&\f(CWti\fR
- is delayed, if a partially collected line exists,
- until after that line is output.
- In fill mode the length of text on an output line is less than or equal to
- the line length minus the indent.
- The current line length and indent are available in registers \&\f(CW.l\fR and \&\f(CW.i\fR respectively.
- The length of \fIthree-part titles\fR produced by \&\f(CWtl\fR
- (see §14) is independently set by \&\f(CWlt\fR.
- .bt "\&\f(CW.ll\fI \(+-N\fR" "6.5\|in" "previous" "E,\fBm\fR" "Line length is set to \(+-@N@.
- .bt "\&\f(CW.in\fI \(+-N\fR" "\fIN\(eq\^\fR0" "previous" "B,E,\fBm\fR" "Indent is set to @+- N@.
- The indent is prefixed to each output line.
- .bt "\&\f(CW.ti\fI \(+-N\fR" "-" "ignored" "B,E,\fBm\fR" "Temporary indent.
- The next output text line will be indented a distance @+- N@
- with respect to the current indent.
- The resulting total indent may not be negative.
- The current indent is not changed.
- .NH
- Macros, Strings, Diversion, and Position Traps
- .sc "Macros and strings.
- A \fImacro\fR is a named set of arbitrary \fIlines\fR that may be invoked by name or
- with a \fItrap\fR.
- A \fIstring\fR is a named string of \fIcharacters\fR,
- not including a newline character,
- that may be interpolated by name at any point.
- Request, macro, and string names share the same name list.
- Macro and string names
- may be one or two characters long and may usurp previously defined
- request, macro, or string names;
- this implies that built-in operations may be (irrevocably) redefined.
- Any of these entities may be renamed with \&\f(CWrn\fR
- or removed with \&\f(CWrm\fR.
- .PP
- Macros are created by \&\f(CWde\fR and \&\f(CWdi\fR, and appended to by \&\f(CWam\fR and \&\f(CWda\fR;
- \&\f(CWdi\fR and \&\f(CWda\fR cause normal output to be stored in a macro.
- A macro is invoked in the same way as a request;
- a control line beginning \&\f(CW.\fIxx\fR will interpolate the contents of macro \fIxx\fR.
- The remainder of the line may contain up to nine \fIarguments\fR.
- .PP
- Strings are created by \&\f(CWds\fR and appended to by \&\f(CWas\fR.
- The strings \fIx\fR and \fIxx\fR are interpolated at any desired point with
- \&\f(CW\e\(**\fIx\fR and \&\f(CW\e\(**(\fIxx\fR respectively.
- String references and macro invocations may be nested.
- .sc "Copy mode input interpretation.
- During the definition and extension
- of strings and macros (not by diversion)
- the input is read in \fIcopy mode\fR.
- In copy mode, input is copied without interpretation
- except that:
- .IP
- .ds + \v'-.1m'\s-4\(bu\s+4\v'+.1m'
- .nf
- \*+ The contents of number registers indicated by \&\f(CW\en\fR are interpolated.
- \*+ Strings indicated by \&\f(CW\e\(**\fR are interpolated.
- \*+ Arguments indicated by \&\f(CW\e$\fR are interpolated.
- \*+ Concealed newlines indicated by \&\f(CW\e\fP\f2newline\fP are eliminated.
- \*+ Comments indicated by \&\f(CW\e"\fR are eliminated.
- \*+ \&\f(CW\et\fR and \&\f(CW\ea\fR are interpreted as \s-1ASCII\s+1 horizontal tab and \s-1SOH\s+1 respectively (§9).
- \*+ \&\f(CW\e\e\fR is interpreted as \&\f(CW\e\fR.
- \*+ \&\f(CW\e.\fR is interpreted as ``\&\f(CW.\fR''.
- .LP
- These interpretations can be suppressed by
- prefixing
- a \&\f(CW\e\fR.
- For example, since \&\f(CW\e\e\fR maps into a \&\f(CW\e\fR, \&\f(CW\e\en\fR will copy as \&\f(CW\en\fR, which
- will be interpreted as a number register indicator when the
- macro or string is reread.
- .sc "Arguments.
- When a macro is invoked by name, the remainder of the line is
- taken to contain up to nine arguments.
- The argument separator is the space character (not tab), and arguments
- may be surrounded by double quotes to permit embedded space characters.
- Pairs of double quotes may be embedded in double-quoted arguments to
- represent a single double-quote character.
- The argument
- .CW \&""
- is explicitly null.
- If the desired arguments won't fit on a line,
- a concealed newline may be used to continue on the next line.
- A trailing double quote may be omitted.
- .PP
- When a macro is invoked the \fIinput level\fR is \fIpushed down\fR and
- any arguments available at the previous level become unavailable
- until the macro is completely read and the previous level is restored.
- A macro's own arguments can be interpolated at any point
- within the macro with
- .CW \e$@N@ ,
- which interpolates the @N@\^th
- argument
- (@1 <= N <= 9@).
- If an invoked argument does not exist,
- a null string results.
- For example, the macro \fIxx\fR may be defined by
- .P1
- .ta .75i
- &de xx \e" begin definition
- Today is \e\e$1 the \e\e$2.
- &. \e" end definition
- .P2
- and called by
- .P1
- &xx Monday 14th
- .P2
- to produce the text
- .P1
- Today is Monday the 14th.
- .P2
- Note that each \&\f(CW\e$\fR
- was concealed in the definition with a prefixed \&\f(CW\e\fR.
- The number of
- arguments is in the \&\f(CW.$\fR register.
- .PP
- No arguments are available at the top (non-macro) level,
- within a string, or within a trap-invoked macro.
- .PP
- Arguments are copied in copy mode onto a stack
- where they are available for reference.
- It is advisable to
- conceal string references (with an extra \&\f(CW\e\fR\|)
- to delay interpolation until argument reference time.
- .sc "Diversions.
- Processed output may be diverted into a macro for purposes
- such as footnote processing (see Tutorial §T5)
- or determining the horizontal and vertical size of some text for
- conditional changing of pages or columns.
- A single diversion trap may be set at a specified vertical position.
- The number registers \&\f(CWdn\fR and \&\f(CWdl\fR respectively contain the
- vertical and horizontal size of the most
- recently ended diversion.
- Processed text that is diverted into a macro
- retains the vertical size of each of its lines when reread
- in \fInofill\fR mode
- regardless of the current \fIV\fR.
- Constant-spaced (\&\f(CWcs\fR) or emboldened (\&\f(CWbd\fR) text that is diverted
- can be reread correctly only if these modes are again or still in effect
- at reread time.
- One way to do this is to embed in the diversion the appropriate
- \&\f(CWcs\fR or \&\f(CWbd\fR requests with the \fItransparent\fR
- mechanism described in §10.6.
- .PP
- Diversions may be nested
- and certain parameters and registers
- are associated
- with the current diversion level
- (the top non-diversion level may be thought of as the
- 0th diversion level).
- These are the diversion trap and associated macro,
- no-space mode,
- the internally-saved marked place (see \&\f(CWmk\fR and \&\f(CWrt\fR),
- the current vertical place (\&\f(CW.d\fR register),
- the current high-water text baseline (\&\f(CW.h\fR register),
- and the current diversion name (\&\f(CW.z\fR register).
- .sc "Traps.
- Three types of trap mechanisms are available\(empage traps, a diversion trap, and
- an input-line-count trap.
- Macro-invocation traps may be planted using \&\f(CWwh\fR at any page position including the top.
- This trap position may be changed using \&\f(CWch\fR.
- Trap positions at or below the bottom of the page
- have no effect unless or until
- moved to within the page or rendered effective by an increase in page length.
- Two traps may be planted at the same position only by first planting them at different
- positions and then moving one of the traps;
- the first planted trap will conceal the second unless and until the first one is moved
- (see Tutorial Examples).
- If the first one is moved back, it again conceals the second trap.
- The macro associated with a page trap is automatically
- invoked when a line of text is output whose vertical size reaches
- or sweeps past the trap position.
- Reaching the bottom of a page springs the top-of-page trap, if any,
- provided there is a next page.
- The distance to the next trap position is available in the \&\f(CW.t\fR register;
- if there are no traps between the current position and the bottom of the page,
- the distance returned is the distance to the page bottom.
- .PP
- A macro-invocation trap effective in the current diversion may be planted using \&\f(CWdt\fR.
- The \&\f(CW.t\fR register works in a diversion; if there is no subsequent trap a large
- distance is returned.
- For a description of input-line-count traps, see \&\f(CWit\fR below.
- .bt "\&\f(CW&de\fI xx yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Define or redefine the macro \fIxx\fR.
- The contents of the macro begin on the next input line.
- Input lines are copied in \fIcopy mode\fR until the definition is terminated by a
- line beginning with \&\f(CW.\fIyy\fR,
- whereupon the macro \fIyy\fR is called.
- In the absence of \fIyy\fR, the definition
- is terminated by a
- line beginning with ``\&\f(CW..\fR''.
- A macro may contain \&\f(CWde\fR requests
- provided the terminating macros differ
- or the contained definition terminator is concealed.
- \&``\&\f(CW..\fR'' can be concealed as
- \&\f(CW\e\e..\fR which will copy as \&\f(CW\e..\fR and be reread as ``\&\f(CW..\fR''.
- .bt "\&\f(CW&am\fI xx yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Append to macro
- .I xx
- (append version of \&\f(CWde\fR).
- .bt "\&\f(CW&ds\fI xx string\fR" "-" "ignored" "-" "Define a string
- \fIxx\fR containing \fIstring\fR.
- Any initial double quote in \fIstring\fR is stripped off to permit
- initial blanks.
- .bt "\&\f(CW&as\fI xx string\fR" "-" "ignored" "-" "Append
- \fIstring\fR to string \fIxx\fR
- (append version of \&\f(CWds\fR).
- .bt "\&\f(CW&rm\fI xx\fR" "-" "ignored" "-" "Remove
- request, macro, or string.
- The name \fIxx\fR is removed from the name list and
- any related storage space is freed.
- Subsequent references will have no effect.
- If many macros and strings are being created dynamically, it
- may become necessary to remove unused ones
- to recapture internal storage space for newer registers.
- .bt "\&\f(CW&rn\fI xx yy\fR" "-" "ignored" "-" "Rename request, macro, or string
- \fIxx\fR to \fIyy\fR.
- If \fIyy\fR exists, it is first removed.
- .bt "\&\f(CW&di\fI xx\fR" "-" "end" "D" "Divert output to macro \fIxx\fR.
- Normal text processing occurs during diversion
- except that page offsetting is not done.
- The diversion ends when the request \&\f(CWdi\fR or \&\f(CWda\fR is encountered without an argument;
- extraneous
- requests of this type should not appear when nested diversions are being used.
- .bt "\&\f(CW&da \fIxx\fR" "-" "end" "D" "Divert, appending to macro \fIxx\fR
- (append version of \&\f(CWdi\fR).
- .bt "\&\f(CW&wh\fI N xx\fR" "-" "-" "\fBv\fR" "Install
- a trap to invoke \fIxx\fR at page position \fIN\fR;
- a negative N will be interpreted as a distance from the
- page bottom.
- Any macro previously planted at @N@ is replaced by \fIxx\fR.
- A zero @N@ refers to the top of a page.
- In the absence of \fIxx\fR, the first trap found at @N@, if any, is removed.
- .bt "\&\f(CW&ch\fI xx N\fR" "-" "-" "\fBv\fR" "Change
- the trap position for macro \fIxx\fR to be @N@.
- In the absence of @N@, the trap, if any, is removed.
- .bt "\&\f(CW&dt\fI N xx\fR" "-" "off" "D,\fBv\fR" "Install a diversion trap
- at position @N@ in the \fIcurrent\fR diversion to invoke
- macro \fIxx\fR.
- Another \&\f(CWdt\fR will redefine the diversion trap.
- If no arguments are given, the diversion trap is removed.
- .bt "\&\f(CW&it\fI N xx\fR" "-" "off" "E" "Set an input-line-count trap
- to invoke the macro \fIxx\fR after @N@ lines of \fItext\fR input
- have been read
- (control or request lines do not count).
- The text may be inline text or
- text interpolated by inline or trap-invoked macros.
- .bt "\&\f(CW&em\fI xx\fR" "none" "none" "-" "The
- macro \fIxx\fR will be invoked
- when all input has ended.
- The effect is almost as if the contents of \fIxx\fR had been at the end
- of the last file processed,
- but all processing ceases at the next page eject.
- .NH
- Number Registers
- .PP
- A variety of parameters are available to the user as
- predefined \fInumber registers\fR (see Summary, page \n(*%).
- In addition, users may define their own registers.
- Register names are one or two characters long and do not conflict
- with request, macro, or string names.
- Except for certain predefined read-only registers,
- a number register can be read, written, automatically
- incremented or decremented, and interpolated
- into the input in a variety of formats.
- One common use of user-defined registers is to
- automatically number sections, paragraphs, lines, etc.
- A number register may be used any time numerical input is expected or desired
- and may be used in numerical \fIexpressions\fR (§1.4).
- .PP
- Number registers are created and modified using \&\f(CWnr\fR, which
- specifies the name, numerical value, and the auto-increment size.
- Registers are also modified, if accessed
- with an auto-incrementing sequence.
- If the registers \fIx\fR and \fIxx\fR both contain
- @N@ and have the auto-increment size @M@,
- the following access sequences have the effect shown:
- .TS
- center box;
- c2|c2|c
- c2|c2|c2
- l2|c2|c2
- l2|c2|c2
- l2|l2|c2.
- Effect on Value
- Sequence Register Interpolated
- _
- \&\f(CW\en\fIx\fR none @N@
- \&\f(CW\en(\fIxx\fR none @N@
- \&\f(CW\en+\fIx\fR \fIx\fR incremented by @M@ \fIN+M\fR
- \&\f(CW\en-\fIx\fR \fIx\fR decremented by @M@ \fIN-M\fR
- \&\f(CW\en+(\fIxx\fR \fIxx\fR incremented by @M@ \fIN+M\fR
- \&\f(CW\en-(\fIxx\fR \fIxx\fR decremented by @M@ \fIN-M\fR
- .TE
- When interpolated, a number register is converted to
- decimal (default),
- decimal with leading zeros,
- lower-case Roman,
- upper-case Roman,
- lower-case sequential alphabetic,
- or
- upper-case sequential alphabetic
- according to the format specified by \&\f(CWaf\fR.
- .bt "\&\f(CW&nr\fI R \(+-N M\fR" "" "-" "\fBu\fR" "The number register
- @R@ is assigned the value @+- N@
- with respect to the previous value, if any.
- The increment for auto-incrementing is set to @M@.
- .bt "\&\f(CW&af\fI R c\fR" "arabic" "-" "-" "Assign
- format @c@ to register @R@.
- The available formats are:
- .Tm number register format s
- .TS
- center box;
- c2|c
- c2|c
- c2|l.
- Numbering
- Format Sequence
- _
- \&\f(CW1\fR 0, 1, 2, 3, 4, 5, ...
- \&\f(CW001\fR 000, 001, 002, 003, 004, 005, ...
- \&\f(CWi\fR 0, i, ii, iii, iv, v, ...
- \&\f(CWI\fR 0, I, II, III, IV, V, ...
- \&\f(CWa\fR 0, a, b, c, ..., z, aa, ab, ..., zz, aaa, ...
- \&\f(CWA\fR 0, A, B, C, ..., Z, AA, AB, ..., ZZ, AAA, ...
- .TE
- An arabic format having @N@ digits
- specifies a field width of @N@ digits (example 2 above).
- The read-only registers and the width function
- .CW \ew
- (§11.2)
- are always arabic.
- Warning: the value of a number register in a non-Arabic format
- is not numeric, and will not produce the expected results in expressions.
- .IP
- The function
- .CW \eg@x@
- or
- .CW \eg(@xx@
- returns the format of a number register in a form suitable for
- .CW af ;
- it returns nothing if the register has not been used.
- .bt "\&\f(CW&rr\fI R\fR" "-" "ignored" "-" "Remove number register @R@.
- If many registers are being created dynamically, it
- may become necessary to remove unused registers
- to recapture internal storage space for newer registers.
- The register
- .CW .R
- contains the number of number registers still available.
- .NH
- Tabs, Leaders, and Fields
- .sc "Tabs and leaders.
- The \s-1ASCII\s+1 horizontal tab character and the \s-1ASCII\s+1
- \s-1SOH\s+1 (control-A, hereafter called the \fIleader\fR character)
- can both be used to generate either horizontal motion or
- a string of repeated characters.
- The length of the generated entity is governed
- by internal \fItab stops\fR specifiable
- with \&\f(CWta\fR.
- The default difference is that tabs generate motion and leaders generate
- a string of periods;
- \&\f(CWtc\fR and \&\f(CWlc\fR
- offer the choice of repeated character or motion.
- There are three types of internal tab stops\(em\
- \fIleft\fR adjusting, \fIright\fR adjusting,
- and \fIcentering\fR.
- In the following table,
- \fID\fR is the distance from the current position on the \fIinput\fR line
- (where a tab or leader was found)
- to the next tab stop,
- \fInext-string\fR consists
- of the input characters following the tab (or leader) up to the next tab (or leader) or end of line,
- and
- \fIW\fR is the width of \fInext-string\fR.
- .TS
- center box;
- c2|c2|c
- c2|c2|c
- c2|c2|l.
- Tab Length of motion or Location of
- type repeated characters \fInext-string\fR
- _
- Left \fID\fR Following \fID\fR
- Right \fID-W\fR Right adjusted within \fID\fR
- Centered \fID-W/\fR2 Centered on right end of \fID\fR
- .TE
- The length of generated motion is allowed to be negative, but
- that of a repeated character string cannot be.
- Repeated character strings contain an integer number of characters, and
- any residual distance is prepended as motion.
- Tabs or leaders found after the last tab stop are ignored, but may be used
- as \fInext-string\fR terminators.
- .PP
- Tabs and leaders are not interpreted in copy mode.
- \&\f(CW\et\fR and \&\f(CW\ea\fR always generate a non-interpreted
- tab and leader respectively, and
- are equivalent to actual tabs and leaders in copy mode.
- .sc "Fields.
- A \fIfield\fR is contained between
- a pair of \fIfield delimiter\fR characters,
- and consists of substrings
- separated by \fIpadding\fR indicator characters.
- The field length is the distance on the
- \fIinput\fR line from the position where the field begins to the next tab stop.
- The difference between the total length of all the substrings
- and the field length is incorporated as horizontal
- padding space that is divided among the indicated
- padding places.
- The incorporated padding is allowed to be negative.
- For example,
- if the field delimiter is \&\f(CW#\fR and the padding indicator is \&\f(CW^\fR,
- \&\f(CW#^\fIxxx\&\f(CW^\fIright\|\&\f(CW#\fR
- specifies a right-adjusted string with the string \fIxxx\fR centered
- in the remaining space.
- .h1
- .bt "\&\f(CW&ta\fI Nt ...\fR" "0.8; 0.5in" "none" "E,\fBm\fR" "Set tab stops and types.
- \fIt=\&\f(CWR\fR, right adjusting;
- \fIt=\&\f(CWC\fR, centering;
- \fIt\fR absent, left adjusting.
- \*(Tr tab stops are preset every 0.5in.,
- \*(NR every 0.8in.
- The stop values are separated by spaces, and
- a value preceded by \&\f(CW+\fR
- is treated as an increment to the previous stop value.
- .bt "\&\f(CW&tc\fI c\fR" "none" "none" "E" "The tab repetition character
- becomes @c@,
- or is removed, thus specifying motion.
- .bt "\&\f(CW&lc\fI c\fR" "\&\f(CW.\fR" "none" "E" "The leader repetition character
- becomes @c@,
- or is removed, thus specifying motion.
- .bt "\&\f(CW&fc\fI a b\fR" "off" "off" "-" "The field delimiter
- is set to \fIa\fR;
- the padding indicator is set to the space character or to
- \fIb\fR, if given.
- In the absence of arguments the field mechanism is turned off.
- .NH
- Input and Output Conventions and Character Translations
- .sc "Input character translations.
- Ways of inputting the valid character set were
- discussed in §2.1.
- The \s-1ASCII\s+1 control characters horizontal tab (§9.1),
- \s-1SOH\s+1 (§9.1), and backspace (§10.3) are discussed elsewhere.
- The newline delimits input lines.
- In addition,
- \s-1STX\s+1, \s-1ETX\s+1, \s-1ENQ\s+1, \s-1ACK\s+1, and \s-1BEL\s+1
- are accepted,
- and may be used as delimiters or translated into a graphic with \&\f(CWtr\fR (§10.5).
- All others are ignored.
- .PP
- The \fIescape\fR character \&\f(CW\e\fR
- introduces \fIescape sequences\fR,
- which cause the following character to mean
- another character, or to indicate
- some function.
- .nr %% \n(*%-1
- A complete list of such sequences is given in the Summary on page \n(*%.
- The escape character \&\f(CW\e\fR
- should not be confused with the \s-1ASCII\s+1 control character \s-1ESC\s+1.
- The escape character \&\f(CW\e\fR can be input with the sequence \&\f(CW\e\e\fR.
- The escape character can be changed with \&\f(CWec\fR,
- and all that has been said about the default \&\f(CW\e\fR becomes true
- for the new escape character.
- \&\f(CW\ee\fR can be used to print whatever the current escape character is.
- The escape mechanism may be turned off with \&\f(CWeo\fR,
- and restored with \&\f(CWec\fR.
- .h1
- .bt "\&\f(CW&ec\fI c\fR" "\&\f(CW\e\fR" "\&\f(CW\e\fR" "-" "Set escape character
- to \&\f(CW\e\fR, or to @c@, if given.
- .bt "\&\f(CW&eo\fR" "on" "-" "-" "Turn escape mechanism off.
- .sc "Ligatures.
- .lg0
- The set of available ligatures is device and font dependent,
- but is often a subset of
- \&\fBfi\fR, \&\fBfl\fR, \&\fBff\fR, \&\fBffi\fR, and \&\fBffl\fR.
- They may be input by
- \&\f(CW\e(fi\fR, \&\f(CW\e(fl\fR, \&\f(CW\e(ff\fR, \&\f(CW\e(Fi\fR, and \&\f(CW\e(Fl\fR respectively.
- .lg
- The ligature mode is normally on in \*(TR, and automatically invokes
- ligatures during input.
- .h1
- .bt "\&\f(CW&lg\fI N\fR" "on; off" "on" "-" "Ligature mode
- is turned on if @N@ is absent or non-zero,
- and turned off if @N=0@.
- If @N=2@, only the two-character ligatures are automatically invoked.
- Ligature mode is inhibited for
- request, macro, string, register, or file names,
- and in copy mode.
- No effect in \*(NR.
- .sc "Backspacing, underlining, overstriking, etc.
- Unless in copy mode, the \s-1ASCII\s+1 backspace character is replaced
- by a backward horizontal motion having the width of the
- space character.
- Underlining as a form of line-drawing is discussed in §12.4.
- A generalized overstriking function is described in §12.1.
- .PP
- \*(Nr automatically underlines
- characters in the \fIunderline\fR font,
- specifiable with \&\f(CWuf\fR,
- normally that on font position 2.
- In addition to \&\f(CWft\fR and
- .CW \ef@F@ ,
- the underline font may be selected by \&\f(CWul\fR and \&\f(CWcu\fR.
- Underlining is restricted to an output-device-dependent
- subset of reasonable characters.
- .bt "\&\f(CW&ul\fI N\fR" "off" "@N=1@" "E" "Italicize in \*(TR
- (underline in \*(NR) the next @N@
- input text lines.
- Actually, switch to underline font, saving the
- current font for later restoration;
- other font changes within the span of a \&\f(CWul\fR
- will take effect,
- but the restoration will undo the last change.
- Output generated by \&\f(CWtl\fR (§14) is affected by the
- font change, but does not decrement @N@.
- If @N>1@, there is the risk that
- a trap interpolated macro may provide text
- lines within the span;
- environment switching can prevent this.
- .bt "\&\f(CW&cu\fI N\fR" "off" "@N=1@" "E" "Continuous underline.
- A variant
- of \&\f(CWul\fR that causes \fIevery\fR character to be underlined in \*(NR.
- Identical to \&\f(CWul\fR in \*(TR.
- .bt "\&\f(CW&uf\fI F\fR" "Italic" "Italic" "-" "Underline font set to @F@.
- In \*(NR,
- @F@ may not be on position 1.
- .sc "Control characters.
- Both the control character \&\f(CW.\fR and the \fIno-break\fR
- control character \&\f(CW'\fR may be changed.
- Such a change must be compatible with the design
- of any macros used in the span of the change,
- and
- particularly of any trap-invoked macros.
- .bt "\&\f(CW&cc\fI c\fR" "\&\f(CW.\fR" "\&\f(CW.\fR" "E" "The basic control character
- is set to @c@,
- or reset to ``\&\f(CW.\fR''.
- .bt "\&\f(CW&c2\fI c\fR" "\&\f(CW'" "'\fR" "E" "The \fIno-break\fR control character is set
- to @c@, or reset to ``\&\f(CW'\fR''.
- .sc "Output translation.
- One character can be made a stand-in for another character using \&\f(CWtr\fR.
- All text processing (e.g., character comparisons) takes place
- with the input (stand-in) character, which appears to have the width of the final
- character.
- The graphic translation occurs at the moment of output
- (including diversion).
- .bt "\&\f(CW&tr\fI abcd....\fR" "none" "-" "O" "Translate
- \fIa\fR into \fIb\fR, @c@ into \fId\fR, etc.
- If an odd number of characters is given,
- the last one will be mapped into the space character.
- To be consistent, a particular translation
- must stay in effect from \fIinput\fR to \fIoutput\fR time.
- .sc "Transparent throughput.
- An input line beginning with a \&\f(CW\e!\fR is read in copy mode and \fItrans\%parently\fR output
- (without the initial \&\f(CW\e!\fR);
- the text processor is otherwise unaware of the line's presence.
- This mechanism may be used to pass control information to a post-processor
- or to embed control lines in a macro created by a diversion.
- .sc "Transparent output
- The sequence
- .CW \eX'@anything@'
- copies
- .I anything
- to the output, as a device control function of the form
- .CW x
- .CW X
- .I anything
- (§22).
- Escape sequences in
- .I anything
- are processed.
- .sc "Comments and concealed newlines.
- An uncomfortably long input line that must stay
- one line (e.g., a string definition, or nofilled text)
- can be split into several physical lines by ending all but
- the last one with the escape \&\f(CW\e\fR.
- The sequence \&\f(CW\e\fR@newline@ is always ignored,
- except in a comment.
- Comments may be embedded at the end of any line by
- prefacing them with \&\f(CW\e"\fR.
- The newline at the end of a comment cannot be concealed.
- A line beginning with \&\f(CW\e"\fR will appear as a blank line and
- behave like
- .CW ".sp\ 1" ;
- a comment can be on a line by itself by beginning the line with \&\f(CW.\e"\fR.
- .NH
- Local Horizontal and Vertical Motions, and the Width Function
- .sc "Local Motions.
- The functions \&\f(CW\ev'\fIN\&\f(CW'\fR and
- \&\f(CW\eh'\fIN\&\f(CW'\fR
- can be used for \fIlocal\fR vertical and horizontal motion respectively.
- The distance @N@ may be negative; the positive directions
- are rightward and downward.
- A local motion is one contained within a line.
- To avoid unexpected vertical dislocations, it is necessary that
- the net vertical local motion within a word in filled text
- and otherwise within a line balance to zero.
- The escape sequences providing local motion are
- summarized in the following table.
- .ds Y \0\0\0
- .KS
- .TS
- center box;
- c2|cs2||c2|cs2
- c1|c2c2||c2|c2c2.
- Vertical Effect in Horizontal Effect in
- Local Motion \*(TR \*(NR Local Motion \*(TR \*(NR
- _
- .sp.4
- .TC
- l2|ls2||l2|ls2.
- \&\f(CW\*Y\ev'\fIN\|\f(CW'\fR Move distance @N@ \
- \&\f(CW\*Y\eh'\fIN\|\f(CW'\fR Move distance @N@
- .TC
- _2|_2_2||l2|ls2.
- x x x \&\f(CW\*Y\e\fP\f2space\fP Unpaddable space-size space
- .TC
- l2|l2|l2||l2|ls2.
- \&\f(CW\*Y\eu\fR ½ em up ½ line up \&\f(CW\*Y\e0\fR Digit-size space
- .TC
- l2|l2|l2||_2|_2_2.
- \&\f(CW\*Y\ed\fR ½ em down ½ line down x x x
- .TC
- l2|l2|l2||l2|l2|l2.
- \&\f(CW\*Y\er\fR 1 em up 1 line up \&\f(CW\*Y\e|\fR 1/6 em space ignored
- \&\f(CW\*Y\e^\fR 1/12 em space ignored
- .sp.4
- .TE
- .KE
- As an example,
- \&\f(CWE\s-2\v'-.4m'2\v'.4m'\s+2\fR
- could be generated by a sequence of size changes and motions:
- \&\f(CWE\es-2\ev'-0.4m'2\ev'0.4m'\es+2\fR;
- note that
- the 0.4 em vertical motions are at the smaller size.
- .sc "Width Function.
- The \fIwidth\fR function \&\f(CW\ew'\fIstring\&\f(CW'\fR
- generates the numerical width of \fIstring\fR (in basic units).
- Size and font changes may be embedded in \fIstring\fR,
- and will not affect the current environment.
- For example,
- \&\&\f(CW.ti\ -\ew'\efB1.\ 'u\fR could be used to
- temporarily indent leftward a distance equal to the
- size of the string ``\&\f(CW1.\ \fR'' in font
- .CW B .
- .PP
- The width function also sets three number registers.
- The registers \&\f(CWst\fR and \&\f(CWsb\fR are set respectively to the highest and
- lowest extent of \fIstring\fR relative to the baseline;
- then, for example,
- the total height of the string is \&\f(CW\en(stu-\en(sbu\fR.
- In \*(TR the number register \&\f(CWct\fR is set to a value
- between 0 and 3.
- The value
- 0 means that all of the characters in \fIstring\fR were short lower
- case characters without descenders (like \&\f(CWe\fR);
- 1 means that at least one character has a descender (like \&\f(CWy\fR);
- 2 means that at least one character is tall (like \&\f(CWH\fR);
- and 3 means that both tall characters and characters with
- descenders are present.
- .sc "Mark horizontal place.
- The function \&\f(CW\ek\fIx\fR causes the current horizontal
- position in the \fIinput line\fR to be stored in register \fIx\fR.
- For example,
- the construction \&\f(CW\ekx\fIword\f(CW\eh'|\enxu+3u'\fIword\&\f(CW\fR
- will embolden \fIword\fR by backing up to almost its beginning and overprinting it,
- resulting in \kz\fIword\fR\h'|\nzu+3u'\fIword\fR.
- .NH
- Overstrike, Bracket, Line-drawing, Graphics, and Zero-width Functions
- .sc "Overstriking.
- Automatically centered overstriking of up to nine characters
- is provided by the \fIoverstrike\fR function
- \&\f(CW\eo'\fIstring\&\f(CW\|'\fR.
- The characters in \fIstring\fR are overprinted with centers aligned; the total width
- is that of the widest character.
- \fIstring\fR may not contain local vertical motion.
- As examples,
- \&\f(CW\eo'e\e''\fR produces \o'e\'', and
- \&\f(CW\eo'\e(mo\e(sl'\fR produces \o'\(mo\(sl'.
- .sc "Zero-width characters.
- The function
- .CW \ez@c@
- will output @c@ without spacing over
- it, and can be used to produce left-aligned overstruck
- combinations.
- As examples,
- \&\f(CW\ez□+\fR will produce \z□+, and
- \&\f(CW\e(br\ez\e(rn\e(ul\e(br\fR will produce a small
- badly constructed box \&\(br\z\(rn\(ul\(br\|.
- .sc "Large Brackets.
- The Special Font usually contains a number of bracket construction pieces
- \|\|\(lt\|\|\(lb\|\|\(rt\|\|\(rb\|\|\(lk\|\|\(rk\|\|\(bv\|\|\(lf\|\|\(rf\|\|\(lc\|\|\(rc\|\|
- that can be combined into various bracket styles.
- The function \&\f(CW\eb'\fIstring\&\f(CW\|'\fR may be used to pile
- up vertically the characters in \fIstring\fR
- (the first character on top and the last at the bottom);
- the characters are vertically separated by 1 em and the total
- pile is centered 1/2 em above the current baseline
- (½ line in \*(NR).
- For example,
- .P1
- \eb'\e(lc\e(lf'E\eb'\e(rc\e(rf'\ex'-0.5m'\ex'0.5m'
- .P2
- produces
- \x'-.5m'\x'.5m'\b'\(lc\(lf'E\b'\(rc\(rf'.
- .sc "Line drawing.
- .tr &&
- The function \&\f(CW\el'\fINc\f(CW'\fR (backslash-ell) draws a string of repeated @c@'s towards the right for a distance @N@.
- If @c@ looks like a continuation of
- an expression for @N@, it may be insulated from @N@ with \&\f(CW\e&\fR.
- If @c@ is not specified, the \&\f(CW\(ru\fR (baseline rule) is used
- (underline character in \*(NR).
- If @N@ is negative, a backward horizontal motion
- of size @N@ is made before drawing the string.
- Any space resulting from @N@/(size of @c@) having a remainder is put at the beginning (left end)
- of the string.
- If @N@ is less than the width of @c@,
- a single @c@ is centered on a distance @N@.
- In the case of characters
- that are designed to be connected, such as
- baseline-rule\ \&\f(CW\(ru\fR\|,
- under-rule\ \&\f(CW\(ul\fR\|,
- and
- root-en\ \&\f(CW\(rn\fR\|,
- the remainder space is covered by overlapping.
- As an example, a macro to underscore a string can be written
- .tr &.
- .P1
- .ne 2.1
- &de us
- \e\e$1\e\|l\|'|0\e(ul'
- &&
- .P2
- .ne2.1
- .de xu
- \\$1\l'|0\(ul'
- ..
- or one to draw a box around a string
- .P1
- &de bx
- \e(br\e|\e\e$1\e|\e(br\e\|l\|'|0\e(rn'\e\|l\|'|0\e(ul'
- &&
- .P2
- .de bx
- \(br\|\\$1\|\(br\l'|0\(rn'\l'|0\(ul'
- ..
- such that
- .P1
- &ul "underlined words"
- .P2
- and
- .P1
- &bx "words in a box"
- .P2
- yield
- .xu "underlined words"
- and
- .bx "words in a box"
- \h'-\w'.'u'.
- .PP
- The function \&\f(CW\eL'\fINc\&\f(CW'\fR draws a vertical line consisting
- of the (optional) character @c@ stacked vertically apart 1\|em
- (1 line in \*(NR),
- with the first two characters overlapped,
- if necessary, to form a continuous line.
- The default character is the \fIbox rule\fR \|\(br\| (\&\f(CW\|\e(br\fR);
- the other suitable character is the \fIbold vertical\fR \|\(bv\| (\&\f(CW\|\e(bv\fR).
- The line is begun without any initial motion relative to the
- current baseline.
- A positive @N@ specifies a line drawn downward and
- a negative @N@ specifies a line drawn upward.
- After the line is drawn no compensating
- motions are made;
- the instantaneous baseline is at the end of the line.
- .PP
- .de eb
- .sp -1
- .nf
- \h'-.5n'\L'|\\nzu-1'\l'\\n(.lu+1n\(ul'\L'-|\\nzu+1'\l'|0u-.5n\(ul'
- .fi
- ..
- .ne 2i
- .mk z
- .nr z \nz+1
- The horizontal and vertical line drawing functions may be used
- in combination to produce large boxes.
- The zero-width \fIbox-rule\fR and the ½-em wide \fIunder-rule\fR
- were designed to form corners when using 1-em vertical
- spacings.
- For example the macro
- .nr x \n(DV
- .nr DV 0
- .P1 .15i
- .ps -1
- \&.de eb
- \&.sp -1 \e"compensate for next automatic baseline spacing
- \&.nf \e"avoid possibly overflowing word buffer
- \&\eh'-.5n'\eL'|\e\enau-1'\el'\e\en(.lu+1n\e(ul'\eL'-|\e\enau+1'\el'|0u-.5n\e(ul'
- \&.fi
- \&..
- .ps +1
- .P2
- .nr DV \nx
- will draw a box around some text whose beginning vertical place was
- saved in number register \fIa\fR
- (e.g., using \&\f(CW.mk\ a\fR)
- as was done for this paragraph.
- .eb
- .sc "Graphics.
- The function
- .CW \eD'@c...@'
- draws a graphic object of type @c@
- according to a sequence of parameters,
- which are generally pairs of numbers.
- .IP
- .nf
- .ta 1.7i
- \f(CW\eD'l @dh~ dv@' \f1draw line from current position by @dh,~dv@\f(CW
- \f(CW\eD'c @d@' \f1draw circle of diameter @d@ with left side at current position\f(CW
- \f(CW\eD'e @d sub 1 d sub 2@' \f1draw ellipse of diameters @d sub 1@ and @d sub 2@\f(CW
- \f(CW\eD'a @dh sub 1~ dv sub 1~ dh sub 2~ dv sub 2@'\f(CW \f1draw arc from current position to @dh sub 1 +dh sub 2@, @dv sub 1 +dv sub 2@,\f(CW
- \f1with center at @dh sub 1 ,~ dv sub 1@ from current position\f(CW
- \f(CW\eD'~ @dh sub 1 dv sub 1 dh sub 2 dv sub 2 "..."@'\f(CW \f1draw B-spline from current position by @dh sub 1, dv sub 1@,\f(CW
- \f1then by @dh sub 2 , dv sub 2@, then by @dh sub 2 , dv sub 2@, then ...\f(CW
- .LP
- For example,
- .CW "\eD'e0.2i 0.1i'"
- draws the ellipse
- \D'e.2i .1i'\|,
- and
- .CW "\eD'l.2i -.1i'\eD'l.1i .1i'"
- the line
- \D'l.2i -.1i'\D'l.1i .1i'\|.
- A
- .CW \\eD
- with an unknown @c@ is processed and copied through to the output
- for unspecified interpretation;
- coordinates are interpreted alternately as horizontal and vertical
- values.
- .PP
- Numbers taken as horizontal (first, third, etc.) have default scaling of ems;
- vertical numbers (second, fourth, etc.) have default scaling of @V^@s (§1.3).
- The position after a graphical object has been drawn is
- at its end; for circles and ellipses, the ``end''
- is at the right side.
- .NH
- Hyphenation.
- .PP
- Automatic hyphenation may be switched off and on.
- When switched on with \&\f(CWhy\fR,
- several variants may be set.
- A \fIhyphenation indicator\fR character may be embedded in a word to
- specify desired hyphenation points,
- or may be prefixed to suppress hyphenation.
- In addition,
- the user may specify a small list of exception words.
- .PP
- Only words that consist of a central alphabetic string
- surrounded by (usually null) non-alphabetic strings
- are candidates for automatic hyphenation.
- Words that contain hyphens
- (minus),
- em-dashes (\&\f(CW\e(em\fR),
- or hyphenation indicator characters
- are always subject to splitting after those characters,
- whether automatic hyphenation is on or off.
- .bt "\&\f(CW&nh\fR" "hyphenate" "-" "E" "Automatic hyphenation is turned off.
- .bt "\&\f(CW&hy\fP@~N@" "on, @N=1@" "on, @N=1@" "E" "Automatic hyphenation is turned on
- for @N >= 1@, or off for @N=0@.
- If @N=2@, last lines (ones that will cause a trap)
- are not hyphenated.
- For @N=4@ and 8, the last and first two characters
- respectively of a word are not split off.
- These values are additive;
- i.e., @N=14@ will invoke all three restrictions.
- .bt "\&\f(CW&hc\fI c\fR" "\&\f(CW\e%" "\e%\fR" "E" "Hyphenation indicator character is set
- to @c@ or to the default \&\f(CW\e%\fR.
- The indicator does not appear in the output.
- .bt "\&\f(CW&hw\fI word ...\fR" "" "ignored" "-" "Specify
- hyphenation points in words
- with embedded minus signs.
- Versions of a word with terminal \fIs\fR are implied;
- i.e.,
- .CW dig-it
- implies
- .CW dig-its .
- This list is examined initially and after
- each suffix stripping.
- The space available is small.
- .NH
- Three-Part Titles.
- .PP
- The titling function \&\f(CWtl\fR provides for automatic placement
- of three fields at the left, center, and right of a line
- with a title length
- specifiable with \&\f(CWlt\fR.
- \&\f(CWtl\fR may be used anywhere, and is independent of the
- normal text collecting process.
- A common use is in header and footer macros.
- .h1
- .bt "\&\f(CW&tl '\fIleft\fP'\fIcenter\fP'\fIright\fP'\fR" "-" "-" "" "The strings
- \fIleft\fR, \fIcenter\fR, and \fIright\fR are
- respectively left-adjusted, centered, and right-adjusted
- in the current title length.
- Any of the strings may be empty,
- and overlapping is permitted.
- If the page-number character (initially \&\f(CW%\fR) is found within any of the fields it is replaced
- by the current page number in the format assigned to register \&\f(CW%\fR.
- Any character may be used in place of
- .CW '
- as the string delimiter.
- .bt "\&\f(CW&pc\fI c\fR" "\&\f(CW%\fR" "off" "-" "The page number character is set to @c@,
- or removed.
- The page number register remains \&\f(CW%\fR.
- .bt "\&\f(CW<\fI \(+-N\fR" "6.5\|in" "previous" "E,\fBm\fR" "Length of title
- is set to @+- N@.
- The line length and the title length are independent.
- Indents do not apply to titles; page offsets do.
- .NH
- Output Line Numbering.
- .PP
- .ll -\w'0000'u
- .nm 1 3
- Automatic sequence numbering of output lines may be
- requested with \&\f(CWnm\fR.
- When in effect,
- a three-digit, arabic number plus a digit-space
- is prefixed to output text lines.
- The text lines are thus offset by four digit-spaces,
- and otherwise retain their line length;
- a reduction in line length may be desired to keep the right margin
- aligned with an earlier margin.
- Blank lines, other vertical spaces, and lines generated by \&\f(CWtl\fR
- are not numbered.
- Numbering can be temporarily suspended with \&\f(CWnn\fR,
- or with an \&\f(CW.nm\fR followed by a later \&\f(CW.nm +0\fR.
- In addition,
- a line number indent \fII\fR, and the number-text separation \fIS\fR
- may be specified in digit-spaces.
- Further, it can be specified that only those line numbers that are
- multiples of some number @M@ are to be printed (the others will appear
- as blank number fields).
- .br
- .nm
- .ll
- .bt "\&\f(CW&nm\fI \(+-N M S I\fR" "" "off" "E" "Line number mode.
- If @+- N@ is given,
- line numbering is turned on,
- and the next output line numbered is numbered @+- N@.
- Default values are @M=1@, @S=1@, and @I=0@.
- Parameters corresponding to missing arguments are unaffected;
- a non-numeric argument is considered missing.
- In the absence of all arguments, numbering is turned off;
- the next line number is preserved for possible further use
- in number register \&\f(CWln\fR.
- .bt "\&\f(CW&nn\fI N\fR" "-" "@N=1@" "E" "The next @N@ text output lines are not
- numbered.
- .PP
- .ll -\w'0000'u
- .nm +0
- As an example, the paragraph portions of this section
- are numbered with \fIM=\fR\|3:
- \&\&\f(CW.nm\ 1\ 3\fR was placed at the beginning;
- \&\&\f(CW.nm\fR was placed at the end of the first paragraph;
- and \&\f(CW.nm\ +0\fR was placed in front of this paragraph;
- and \&\f(CW.nm\fR finally placed at the end.
- Line lengths were also changed (by \&\f(CW\ew'0000'u\fR) to keep the right side aligned.
- Another example is
- .CW .nm
- .CW +5
- .CW 5
- .CW x
- .CW 3 ,
- which turns on numbering with the line number of the next
- line to be 5 greater than the last numbered line,
- with @M=5@, with spacing \fIS\fR untouched, and with the indent \fII\fR set to 3.
- .br
- .ll
- .nm
- .NH
- Conditional Acceptance of Input
- .PP
- In the following,
- @c@ is a one-character built-in \fIcondition\fR name,
- \&\f(CW!\fR signifies \fInot\fR,
- @N@ is a numerical expression,
- \fIstring1\fR and \fIstring2\fR are strings delimited by any non-blank, non-numeric character not in the strings,
- and
- \fIanything\fR represents what is conditionally accepted.
- .bt "\&\f(CW&if\fI c anything\fR" "-" "-" "" "If condition
- @c@ true, accept \fIanything\fR as input;
- in multi-line case use \e{\fIanything\|\fR\e}.
- .bt "\&\f(CW&if !\fIc anything\fR" "-" "-" "" "If condition @c@ false, accept \fIanything\fR.
- .bt "\&\f(CW&if\fI N anything\fR" "" "-" "\fBu\fR" "If expression @N@ > 0, accept \fIanything\fR.
- .bt "\&\f(CW&if !\fIN anything\fR" "" "-" "\fBu\fR" "If expression @N@ ≤ 0 [sic], accept \fIanything\fR.
- .bt "\&\f(CW&if '\fIstring1\f(CW'\fIstring2\f(CW'\fI anything\fR" "-" "" "" "If \fIstring1\fR identical to \fIstring2\fR,
- accept \fIanything\fR.
- .bt "\&\f(CW&if !'\fIstring1\f(CW'\fIstring2\f(CW'\fI anything\fR" "-" "" "" "If \fIstring1\fR not identical to \fIstring2\fR,
- accept \fIanything\fR.
- .bt "\&\f(CW&ie\fI c anything\fR" "" "-" "\fBu\fR" "If portion of if-else;
- all of the forms for \&\f(CWif\fR above are valid.
- .bt "\&\f(CW&el\fI anything\fR" "-" "-" "" "Else portion of if-else.
- .PP
- The built-in condition names are:
- .TS
- center box;
- c2|c2
- c2|c2
- c2|l2.
- Condition
- Name True If
- _
- \&\f(CWo\fR Current page number is odd
- \&\f(CWe\fR Current page number is even
- \&\f(CWt\fR Formatter is \*(TR
- \&\f(CWn\fR Formatter is \*(NR
- .TE
- If the condition @c@ is true, or if the number @N@ is greater than zero,
- or if the strings compare identically (including motions and character size and font),
- \fIanything\fR is accepted as input.
- If a \&\f(CW!\fR precedes the condition, number, or string comparison,
- the sense of the acceptance is reversed.
- .PP
- Any spaces between the condition and the beginning of \fIanything\fR are skipped over.
- The \fIanything\fR can be either a single input line (text, macro, or whatever)
- or a number of input lines.
- In the multi-line case,
- the first line must begin with a left delimiter \&\f(CW\e{\fR and
- the last line must end with a right delimiter \&\f(CW\e}\fR.
- .PP
- The request \&\f(CWie\fR (if-else) is identical to \&\f(CWif\fR
- except that the acceptance state is remembered.
- A subsequent and matching \&\f(CWel\fR (else) request then uses the reverse sense of that state.
- \&\f(CWie\fR-\&\f(CWel\fR pairs may be nested.
- .PP
- Some examples are:
- .P1
- &if e .tl '\|Even Page %'''
- .P2
- which outputs a title if the page number is even; and
- .P1
- &ie \en%>1 \e{\e
- \&' sp 0.5i
- & tl 'Page %'''
- \&' sp |1.2i \e}
- &el .sp |2.5i
- .P2
- which treats page 1 differently from other pages.
- .NH
- Environment Switching.
- .PP
- A number of the parameters that
- control the text processing are gathered together into an
- \fIenvironment\fR, which can be switched by the user.
- The environment parameters are those associated
- with requests noting E in their \fINotes\fR column;
- in addition, partially collected lines and words are in the environment.
- Everything else is global; examples are page-oriented parameters,
- diversion-oriented parameters, number registers, and macro and string definitions.
- All environments are initialized with default parameter values.
- .bt "\&\f(CW&ev\fI N\fR" "@N=0@" "previous" "-" "Environment switched to
- environment @0 <= N <= 2@.
- Switching is done in push-down fashion so that
- restoring a previous environment \fImust\fR be done with \&\f(CW.ev\fR
- rather than specific reference.
- Note that what is pushed down and restored is the environment
- .I number,
- not its contents.
- .NH
- Insertions from the Standard Input
- .PP
- The input can be temporarily switched to the system standard input
- with \&\f(CWrd\fR,
- which will switch back when two consecutive newlines
- are found (the extra blank line is not used).
- This mechanism is intended for insertions in form-letter-like documentation.
- The standard input can be the user's keyboard,
- a pipe, or a file.
- .bt "\&\f(CW&rd\fI prompt\fR" "-" "\fIprompt=\fR\s-1BEL\s+1" "-" "Read insertion
- from the standard input until two newlines in a row are found.
- If the standard input is the user's keyboard, \fIprompt\fR (or a \s-1BEL\s+1)
- is written onto the standard output.
- \&\f(CWrd\fR behaves like a macro,
- and arguments may be placed after \fIprompt\fR.
- .bt "\&\f(CW&ex\fR" "-" "-" "-" "Exit from \*(NR/\*(TR.
- Text processing is terminated exactly as if all input had ended.
- .PP
- If insertions are to be
- taken from the terminal keyboard while output is being printed
- on the terminal, the command line option \&\f(CW-q\fR will turn off the echoing
- of keyboard input and prompt only with \s-1BEL\s+1.
- The regular input and insertion input cannot
- simultaneously come from the standard input.
- .PP
- As an example,
- multiple copies of a form letter may be prepared by entering the insertions
- for all the copies in one file to be used as the standard input,
- and causing the file containing the letter to reinvoke itself with \&\f(CWnx\fR (§19);
- the process would ultimately be ended by an \&\f(CWex\fR in the insertion file.
- .NH
- Input/Output File Switching
- .bt "\&\f(CW&so\fI filename\fR" "" "-" "-" "Switch source file.
- The top input (file reading) level is switched to \fIfilename\fR.
- When the new file ends,
- input is again taken from the original file.
- \&\f(CWso\fR's may be nested.
- .bt "\&\f(CW&nx\fI filename\fR" "" "end-of-file" "-" "Next file is \fIfilename\fR.
- The current file is considered ended, and the input is immediately switched
- to \fIfilename\fR.
- .bt "\&\f(CW&sy\fI string\fR" "" "-" "-" "Execute program from \fIstring\fR,
- which is the rest of the input line.
- The output is not collected automatically.
- The number register
- .CW $$ ,
- which contains the process id of the \*(TR process,
- may be useful in generating unique filenames for output.
- .bt "\&\f(CW&pi\fI string\fR" "" "-" "-" "Pipe output to \fIstring\fR,
- which is the rest of the input line.
- This request must occur before any printing occurs;
- typically it is the first line of input.
- .bt "\&\f(CW&cf\fI filename\fR" "" "-" "-" "Copy
- contents of file
- .I filename
- to output, completely unprocessed.
- The file is assumed to contain something meaningful
- to subsequent processes.
- .NH
- Miscellaneous
- .br
- .mc \s12\(br\s0
- .bt "\&\f(CW.mc\fI c N\fR" - off E,\fBm\fR "Specifies
- that a \fImargin\fR character @c@ appear a distance
- @N@ to the right of the right margin
- after each non-empty text line (except those produced by \&\f(CWtl\fR).
- If the output line is too long (as can happen in nofill mode)
- the character will be appended to the line.
- If @N@ is not given, the previous @N@ is used; the initial @N@ is
- 0.2 inches in \*(NR and 1 em in \*(TR.
- The margin character used with this paragraph was a 12-point box-rule.
- .br
- .mc
- .bt "\&\f(CW.tm\fI string\fR" "-" "newline" "-" "After skipping initial blanks,
- \fIstring\fR (rest of the line) is read in copy mode
- and written on the standard error.
- .bt "\&\f(CW&ab\fI string\fR" "-" "newline" "-" "After skipping initial blanks,
- \fIstring\fR (rest of the line) is read in copy mode
- and written on the standard error.
- \*(Tr or \*(NR then exit.
- .bt "\&\f(CW.ig\fI yy\fR" "-" "\fI.yy=\&\f(CW..\fR" "-" "Ignore
- input lines.
- \&\f(CWig\fR behaves exactly like \&\f(CWde\fR (§7) except that the
- input is discarded.
- The input is read in copy mode, and any auto-incremented
- registers will be affected.
- .bt "\&\f(CW.lf\fI N filename\fR" "" "-" "-" "Set
- line number to @N@ and filename to @filename@
- for purposes of subsequent error messages, etc.
- The number register [sic]
- .CW .F
- contains the name of the current input file,
- as set by command line argument,
- .CW so ,
- .CW nx ,
- or
- .CW lf .
- The number register
- .CW .c
- contains the number of input lines read from the current file,
- again perhaps as modified by
- .CW lf .
- .CW
- .bt "\&\f(CW.pm\fI t\fR" "-" "all" "-" "Print macros.
- The names and sizes of all of the defined macros and strings are printed
- on the standard error;
- if \fIt\fR is given, only the total of the sizes is printed.
- The sizes is given in blocks
- of 128 characters.
- .bt "\&\f(CW.fl\fR" - - B "Flush output buffer.
- Force output, including any pending position information.
- ......
- .NH
- Output and Error Messages.
- .PP
- The output from \&\f(CWtm\fR, \&\f(CWpm\fR, and the prompt from \&\f(CWrd\fR,
- as well as various error messages, are written onto
- the standard error.
- The latter is different from the standard output,
- where formatted text goes.
- By default, both are written onto the user's terminal,
- but they can be independently redirected.
- .PP
- Various error conditions may occur during
- the operation of \*(NR and \*(TR.
- Certain less serious errors having only local impact do not
- cause processing to terminate.
- Two examples are \fIword overflow\fR, caused by a word that is too large
- to fit into the word buffer (in fill mode), and
- \fIline overflow\fR, caused by an output line that grew too large
- to fit in the line buffer.
- In both cases, a message is printed, the offending excess
- is discarded,
- and the affected word or line is marked at the point of truncation
- with a \(** in \*(NR and a \(lh in \*(TR.
- Processing continues if possible,
- on the grounds that output useful for debugging may be produced.
- If a serious error occurs, processing terminates,
- and a message is printed, along with a list of the macro names currently active.
- Examples of serious errors include the inability to create, read, or write files,
- and the exceeding of certain internal limits that
- make future output unlikely to be useful.
- .NH
- Output Language
- .PP
- \*(Tr
- produces its output in a language that is independent of any
- specific output device,
- except that the numbers in it have been computed on the basis
- of the resolution of the device,
- and the sizes, fonts, and characters that that device can print.
- Nevertheless it is quite possible to interpret that output
- on a different device, within the latter's capabilities.
- .IP
- .nf
- .ta .7i
- @cw s n@ set point size to @n@
- @cw f n@ set font to @n@
- @cw c c@ print character @c@
- @cw C name@ print the character called @name@; terminate @name@ by white space
- @cw N n@ print character @n@ on current font
- @cw H n@ go to absolute horizontal position \f2n\fP (@n >= 0@)
- @cw V n@ go to absolute vertical position \f2n\fP (@n >= 0@, down is positive)
- @cw h n@ go \f2n\fP units horizontally; @n < 0@ is to the left
- @cw v n@ go \f2n\fP units vertically; @n < 0@ is up
- @nnc@ move right \f2nn\fP, then print \s-1UTF\s0 character \f2c\fP; \f2nn\fP must be exactly 2 digits
- @cw p n@ new page \f2n\fP begins\(emset vertical position to 0
- @cw n b~a@ end of line (information only\(emno action); \f2b\fP = space before line, \f2a\fP = after
- @cw w@ paddable word space (information only\(emno action)
- @cw D c@ ...\en graphics function @c@; see below
- @cw x@ ...\en device control functions; see below
- @cw "#"@ ...\en comment
- .LP
- All position values are in units.
- Sequences that end in digits must be followed by a non-digit.
- Blanks, tabs and newlines may occur as separators
- in the input, and are mandatory to separate constructions
- that would otherwise be confused.
- Graphics functions, device control functions, and comments extend to the
- end of the line they occur on.
- .PP
- The device control and graphics commands are intended as open-ended
- families, to be expanded as needed.
- The graphics functions coincide directly with the
- .CW \eD
- sequences:
- .IP
- .nf
- .ta 1.7i
- @cw Dl@ \f2dh dv\fP draw line from current position by @dh,~ dv@
- @cw Dc@ \f2d\fP draw circle of diameter \f2d\fP with left side here
- @cw De@ @dh sub 1~dv sub 2@ draw ellipse of diameters @dh sub 1@ and @ dv sub 2@\fP
- @cw Da ~dh sub 1~ dv sub 1 ~ dh sub 2 ~dv sub 2@ draw arc from current position to @dh sub 1 +dh sub 2 ,~ dv sub 1 +dv sub 2@,
- center at @dh sub 1 ,~ dv sub 1@ from current position
- @cw "D~" ~dh sub 1 ~dv sub 1 ~dh sub 2 ~dv sub 2@ ... draw B-spline from current position to @dh sub 1 ,~ dv sub 1@,
- then to @dh sub 2 , ~dv sub 2@, then to ...
- @cw "D"z ~dh sub 1 ~dv sub 1 ~dh sub 2 ~dv sub 2@ ... for any other @z@ is uninterpreted
- .LP
- In all of these, @dh, ~dv@ is an increment on the current horizontal and
- vertical position,
- with down and right positive.
- All distances and dimensions are in units.
- .PP
- The device control functions begin with
- .CW x ,
- then a command, then other parameters.
- .IP
- .ta .8i 1.2i
- .nf
- .ft CW
- x T \f2s\fP \f1name of typesetter is @s@\f(CW
- x r \f2n h v\fP \f1resolution is @n@ units/inch;\f(CW
- \f1@h@ = minimum horizontal motion, @v@ = minimum vertical\f(CW
- x i \f1initialize\fP
- x f \f2n s\fP \f1mount font @s@ on font position @n@\f(CW
- x p \f1pause\(emcan restart\f(CW
- x s \f1stop\(emdone forever\f(CW
- x t \f1generate trailer information, if any\f(CW
- x H \f2n\fP \f1set character height to @n@\f(CW
- x S \f2n\fP \f1set slant to @n@\f(CW
- x X \f2any\fP \f1generated by the \&\f(CW\eX\fP function\f(CW
- x \f2any\fP \f1to be ignored if not recognized\f(CW
- .LP
- Subcommands like
- .CW i '' ``
- may be spelled out like
- .CW init ''. ``
- .PP
- The commands
- .CW "x T" ,
- .CW "x r " ...,
- and
- .CW "x i"
- must occur first;
- fonts must be mounted before they can be used;
- .CW "x s
- comes last.
- There are no other order requirements.
- .PP
- The following is the output from
- .CW hello, "" ``
- .CW world ''
- for a typical printer,
- as described in §23:
- .P1
- x T utf
- x res 720 1 1
- x init
- V0
- p1
- .P2
- .P1
- x font 1 R
- x font 2 I
- x font 3 B
- x font 4 BI
- x font 5 CW
- x font 6 H
- x font 7 HB
- x font 8 HX
- x font 9 S1
- x font 10 S
- .P2
- .P1
- s10
- f1
- H0
- s10
- f1
- V0
- H720
- V120
- ch
- 50e44l28l28o50,w58w72o50r33l28dn120 0
- x trailer
- V7920
- x stop
- .P2
- .PP
- \*(Tr output is normally not redundant;
- size and font changes and position information are not included
- unless needed.
- Nevertheless, each page is self-contained, for the benefit of postprocessors
- that re-order pages or process only a subset.
- .NH
- Device and Font Description Files
- .PP
- The parameters that describe a output device
- .I name
- are read
- from the directory
- .CW /sys/lib/troff/font/dev@name@ ,
- each time
- \*(TR
- is invoked.
- The device name is provided by default,
- by the environment variable
- .CW TYPESETTER ,
- or by a command-line argument
- .CW -T@name@ .
- The default device name is
- .CW utf ,
- for \s-1UTF\s0-encoded Unicode characters.
- The pre-defined string
- .CW .T
- contains the name of the device.
- The
- .CW -F
- command-line option may be used to change the default directory.
- .......
- .sc "Device description file.
- General parameters of the device are stored, one per line, in
- the file
- .CW /sys/lib/troff/font/dev@name@/DESC ,
- as a sequence of names and values.
- \*(Tr recognizes these parameters, and ignores any
- others that may be present for specific drivers:
- .IP
- .nf
- .ta 1i
- @cw fonts ~ n ~ F sub 1 ~F sub 2 ~. . .~ F sub n@
- @cw sizes ~ s sub 1 ~ s sub 2 ~ . . . cw 0@
- @cw res ~n@
- @cw hor ~n@
- @cw vert ~n@
- @cw unitwidth ~n@
- @cw charset@
- \f2list of multi-character character names (optional)\fP
- .LP
- The @F sub i@ are font names
- to be initially mounted.
- The list of sizes is a set of integers representing
- some or all of the legal sizes the device can produce,
- terminated by a zero.
- The
- .CW res
- parameter gives the resolution of the machine in units per inch;
- .CW hor
- and
- .CW ver
- give the minimum number of units that can be moved
- horizontally and vertically.
- .PP
- Character widths for each font are assumed to be given in machine units
- at point size
- .CW unitwidth .
- (In other words, a character with a width of
- @n@ is @n@ units wide at size
- .CW unitwidth .)
- All widths are integers at all sizes.
- .PP
- A list of valid character names may be introduced by
- .CW charset ;
- the list of names is optional.
- .PP
- A line whose first non-blank character is
- .CW #
- is a comment.
- Except that
- .CW charset
- must occur last, parameters may appear in any order.
- .PP
- Here is a subset of the
- .CW DESC
- file for a typical Postscript printer:
- .P1
- # Description file for Postscript printers.
- fonts 10 R I B BI CW H HB HX S1 S
- sizes 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
- 24 25 26 27 28 29 30 31 32 33 34 35 36 38 40 44 48 54 60 72 0
- res 720
- hor 1
- vert 1
- unitwidth 10
- charset
- hy ct fi fl ff Fi Fl dg em 14 34 12 en aa
- ga ru sc dd -> br Sl ps cs cy as os =. ld
- rd le ge pp -+ ob vr
- sq bx ci fa te ** pl mi eq ~= *A *B *X *D
- *E *F *G *Y *I *K *L *M *N *O *P *R *H *S *T *U *W
- *C *Q *Z ul rn *a *b *x *d *e *f *g *y *i *k
- *l *m *n *o *p *h *r *s *t *u *w *c *q *z
- .P2
- .sc "Font description files.
- Each font is described by an analogous description file,
- which begins with parameters of the font, one per line, followed by a
- list of characters and widths.
- The file for font
- .I f
- is
- .CW /sys/lib/troff/font/dev@name@/@f@ .
- .IP
- .ta 1.7i
- .nf
- @cw name ~str@ name of font is @str@
- @cw ligatures ~ ". . ." ~ cw "0"@ list of ligatures
- @cw spacewidth ~n@ width of a space on this font
- @cw special@ this is a special font
- @cw charset@
- \f2list of character name, width, ascender/descender, code\fP, tab separated
- .LP
- The
- .CW name
- and
- .CW charset
- fields are mandatory;
- .CW charset
- must be last.
- Comments are permitted,
- as are other unrecognized parameters.
- .PP
- Each line following
- .CW charset
- describes one character: its name, its width in units as described above,
- ascender/descender information, and a decimal, octal or hexadecimal value
- by which the output device knows it
- (the
- .CW \eN
- ``number'' of the character).
- The character name is arbitrary, except that
- .CW ---
- signifies an unnamed character.
- If the width field contains
- .CW \&" ,
- the name is a synonym for the previous character.
- The ascender/descender field is 1 if
- the character has a descender (hangs below the baseline, like
- .CW y ),
- is 2 if it has an ascender (is tall, like
- .CW Y ),
- is 3 if both,
- and is 0 if neither.
- The value is returned
- in the
- .CW ct
- register, as computed by the
- .CW \ew
- function (§11.2).
- .PP
- Here are excerpts from a typical font description file
- for the same Postscript printer.
- .P1
- hy 33 0 45 hyphen \e(hy
- - " - is a synonym for \e(hy
- .sp .3
- Q 72 3 81
- .sp .3
- a 44 0 97
- b 50 2 98
- c 44 0 99
- d 50 2 100
- y 50 1 121
- .sp .3
- em 100 0 208
- --- 44 2 220 Pound symbol £, \eN'220'
- --- 36 0 221 centered dot \eN'221'
- .P2
- This says, for example, that the width of the letter
- .CW a
- is 44 units at point size 10,
- the value of
- .CW unitwidth .
- Point sizes are scaled linearly and rounded, so the width of
- .CW a
- will be 44 at size 10, 40 at size 9, 35 at size 8,
- and so on.
- .sp 100
- .BP
- .fp 8 C CW
- .tr &.
- .tr |
- .tr ~|
- .TL
- Tutorial Examples
- .SP
- ....2C
- .sp .25i
- .SH
- Introduction
- .PP
- It is almost always necessary to
- prepare at least a small set of macro definitions
- to describe a document.
- Such common formatting needs
- as page margins and footnotes
- are deliberately not built into \*(NR and \*(TR.
- Instead,
- the macro and string definition, number register, diversion,
- environment switching, page-position trap, and conditional input mechanisms
- provide the basis for user-defined implementations.
- .PP
- For most uses, a standard package like
- .CW -ms
- or
- .CW -mm
- is the right choice.
- The next stage is to augment that,
- or to selectively replace macros from the standard package.
- The last stage, much harder,
- is to write one's own from scratch.
- This is not a task for the novice.
- .PP
- The examples discussed here are intended to be useful and somewhat realistic,
- but will not necessarily cover all relevant contingencies.
- Explicit numerical parameters are used
- in the examples
- to make them easier to read and to
- illustrate typical values.
- In many cases, number registers would be used
- to reduce the number of places where numerical
- information is kept,
- and to concentrate conditional parameter initialization
- like that which depends on whether \*(TR or \*(NR is being used.
- .SH
- Page Margins
- .PP
- As discussed in §3,
- header and footer macros are usually defined
- to describe the top and bottom page margin areas respectively.
- A trap is planted at page position 0 for the header, and at
- \fI-N\fR (\fIN\fR from the page bottom) for the footer.
- The simplest such definitions might be
- .P1 .1i
- &de hd \e"define header
- \&'sp 1i
- && \e"end definition
- &de fo \e"define footer
- \&'bp
- && \e"end definition
- &wh 0 hd
- &wh -1i fo
- .P2
- which provide blank 1 inch top and bottom margins.
- The header will occur on the \fIfirst\fR page
- only if the definition and trap exist prior to
- the initial pseudo-page transition (§3).
- In fill mode, the output line that springs the footer trap
- was typically forced out because some part or whole word didn't fit on it.
- If anything in the footer and header that follows causes a break,
- that word or part word will be forced out.
- In this and other examples,
- requests like \&\f(CWbp\fR and \&\f(CWsp\fR that normally cause breaks are invoked using
- the no-break control character \&\f(CW'\fR
- to avoid this.
- When the header/footer design contains material
- requiring independent text processing, the
- environment may be switched, avoiding
- most interaction with the running text.
- .PP
- A more realistic example would be
- .P1 .1i
- &de hd \e"header
- &if \e\en%>1 \e{\e
- \&'sp ~0.5i-1 \e"tl base at 0.5i
- &tl ''- % -'' \e"centered page number
- &ps \e"restore size
- &ft \e"restore font
- &vs \e} \e"restore vs
- \&'sp ~1.0i \e"space to 1.0i
- &ns \e"turn on no-space mode
- &&
- &de fo \e"footer
- &ps 10 \e"set footer/header size
- &ft R \e"set font
- &vs 12p \e"set baseline spacing
- &if \e\en%=1 \e{\e
- \&'sp ~\e\en(.pu-0.5i-1 \e"tl base 0.5i up
- &tl ''- % -'' \e} \e"first page number
- \&'bp
- &&
- &wh 0 hd
- &wh -1i fo
- .P2
- which sets the size, font, and baseline spacing for the
- header/footer material, and ultimately restores them.
- The material in this case is a page number at the bottom of the
- first page and at the top of the remaining pages.
- The \&\f(CWsp\fR's refer to absolute positions to avoid
- dependence on the baseline spacing.
- Another reason for doing this in the footer
- is that the footer is invoked by printing a line whose
- vertical spacing swept past the trap position by possibly
- as much as the baseline spacing.
- No-space mode is turned on at the end of \&\f(CWhd\fR
- to render ineffective
- accidental occurrences of \&\f(CWsp\fR at the top of the running text.
- .PP
- This method of restoring size, font, etc., presupposes
- that such requests (that set \fIprevious\fR value) are \fInot\fR
- used in the running text.
- A better scheme is to save and restore both the current \fIand\fR
- previous values as shown for size in the following:
- .P1 .1i
- &de fo
- &nr s1 \e\en(.s \e"current size
- &ps
- &nr s2 \e\en(.s \e"previous size
- & --- \e"rest of footer
- &&
- &de hd
- & --- \e"header stuff
- &ps \e\en(s2 \e"restore previous size
- &ps \e\en(s1 \e"restore current size
- &&
- .P2
- Page numbers may be printed in the bottom margin
- by a separate macro triggered during the footer's
- page ejection:
- .P1 .1i
- &de bn \e"bottom number
- &tl ''- % -'' \e"centered page number
- &&
- &wh -0.5i-1v bn \e"tl base 0.5i up
- .P2
- .SH
- Paragraphs and Headings
- .PP
- The housekeeping
- associated with starting a new paragraph should be collected
- in a paragraph macro
- that, for example,
- does the desired preparagraph spacing,
- forces the correct font, size, baseline spacing, and indent,
- checks that enough space remains for \fImore than one\fR line,
- and
- requests a temporary indent.
- .P1 .1i
- &de pg \e"paragraph
- &br \e"break
- &ft R \e"force font,
- &ps 10 \e"size,
- &vs 12p \e"spacing,
- &in 0 \e"and indent
- &sp 0.4 \e"prespace
- &ne 1+\e\en(.Vu \e"want more than 1 line
- &ti 0.2i \e"temp indent
- &&
- .P2
- The first break in \&\f(CWpg\fR
- will force out any previous partial lines,
- and must occur before the \&\f(CWvs\fR.
- The forcing of font, etc., is
- partly a defense against prior error and
- partly to permit
- things like section heading macros to
- set parameters only once.
- The prespacing parameter is suitable for \*(TR;
- a larger space, at least as big as the output device vertical resolution, would be
- more suitable in \*(NR.
- The choice of remaining space to test for in the \&\f(CWne\fR
- is the smallest amount greater than one line
- (the \&\f(CW.V\fR is the available vertical resolution).
- .PP
- A macro to automatically number section headings
- might look like:
- .P1 .1i
- &de sc \e"section
- & --- \e"force font, etc.
- &sp 0.4 \e"prespace
- &ne 2.4+\e\en(.Vu \e"want 2.4+ lines
- .lg 0
- &fi
- .lg
- \e\en+S.
- &&
- &nr S 0 1 \e"init S
- .P2
- The usage is \&\f(CW.sc\fR,
- followed by the section heading text,
- followed by \&\f(CW.pg\fR.
- The \&\f(CWne\fR test value includes one line of heading,
- 0.4 line in the following \&\f(CWpg\fR, and
- one line of the paragraph text.
- A word consisting of the next section number and a period is
- produced to begin the heading line.
- The format of the number may be set by \&\f(CWaf\fR (§8).
- .PP
- Another common form is the labeled, indented paragraph,
- where the label protrudes left into the indent space.
- .P1 .1i
- &de lp \e"labeled paragraph
- &pg
- &in 0.5i \e"paragraph indent
- &ta 0.2i 0.5i \e"label, paragraph
- &ti 0
- \et\e\e$1\et\ec \e"flow into paragraph
- &&
- .P2
- The intended usage is ``\&\f(CW.lp\fR \fIlabel\fR\|'';
- \fIlabel\fR will begin at 0.2 inch, and
- cannot exceed a length of 0.3 inch without intruding into
- the paragraph.
- The label could be right adjusted against 0.4 inch by
- setting the tabs instead with \&\f(CW.ta|0.4iR|0.5i\fR.
- The last line of \&\f(CWlp\fR ends with \&\f(CW\ec\fR so that
- it will become a part of the first line of the text
- that follows.
- .SH
- Multiple Column Output
- .PP
- The production of multiple column pages requires
- the footer macro to decide whether it was
- invoked by other than the last column,
- so that it will begin a new column rather than
- produce the bottom margin.
- The header can initialize a column register that
- the footer will increment and test.
- The following is arranged for two columns, but
- is easily modified for more.
- .P1 .1i
- &de hd \e"header
- & ---
- &nr cl 0 1 \e"init column count
- &mk \e"mark top of text
- &&
- .P2
- .P1 .1i
- &de fo \e"footer
- &ie \e\en+(cl<2 \e{\e
- &po +3.4i \e"next column; 3.1+0.3
- &rt \e"back to mark
- &ns \e} \e"no-space mode
- &el \e{\e
- &po \e\enMu \e"restore left margin
- & ---
- \&'bp \e}
- &&
- &ll 3.1i \e"column width
- &nr M \e\en(.o \e"save left margin
- .P2
- Typically a portion of the top of the first page
- contains full width text;
- the request for the narrower line length,
- as well as another \&\f(CW.mk\fR would
- be made where the two column output was to begin.
- .SH
- Footnotes
- .PP
- The footnote mechanism to be described is used by
- embedding the footnotes in the input text at the
- point of reference,
- demarcated by an initial \&\f(CW.fn\fR and a terminal \&\f(CW.ef\fR:
- .P1 .1i
- &fn
- \fIFootnote text and control lines...\fP
- &ef
- .P2
- In the following,
- footnotes are processed in a separate environment and diverted
- for later printing in the space immediately prior to the bottom
- margin.
- There is provision for the case where the last collected
- footnote doesn't completely fit in the available space.
- .P1 .1i
- &de hd \e"header
- & ---
- &nr x 0 1 \e"init footnote count
- &nr y 0-\e\enb \e"current footer place
- &ch fo -\e\enbu \e"reset footer trap
- &if \e\en(dn .fz \e"leftover footnote
- &&
- .P2
- .P1 .1i
- &de fo \e"footer
- &nr dn 0 \e"zero last diversion size
- &if \e\enx \e{\e
- &ev 1 \e"expand footnotes in ev1
- &nf \e"retain vertical size
- &FN \e"footnotes
- &rm FN \e"delete it
- .P2
- .P1 .1i
- &if "\e\en(.z"fy" .di \e"end overflow di
- &nr x 0 \e"disable fx
- &ev \e} \e"pop environment
- & ---
- \&'bp
- &&
- .P2
- .P1 .1i
- &de fx \e"process footnote overflow
- &if \e\enx .di fy \e"divert overflow
- &&
- .P2
- .P1 .1i
- &de fn \e"start footnote
- &da FN \e"divert (append) footnote
- &ev 1 \e"in environment 1
- &if \e\en+x=1 .fs \e"if 1st, separator
- &fi \e"fill mode
- &&
- .P2
- .P1 .1i
- &de ef \e"end footnote
- &br \e"finish output
- &nr z \e\en(.v \e"save spacing
- &ev \e"pop ev
- &di \e"end diversion
- &nr y -\e\en(dn \e"new footer position,
- &if \e\enx=1 .nr y -(\e\en(.v-\e\enz) \e
- \e"uncertainty correction
- &ch fo \e\enyu \e"y is negative
- &if (\e\en(nl+1v)>(\e\en(.p+\e\eny) \e
- &ch fo \e\en(nlu+1v \e"didn't fit
- &&
- .P2
- .P1 .1i
- &de fs \e"separator
- \el'1i' \e"1 inch rule
- &br
- &&
- .P2
- .P1 .1i
- &de fz \e"get leftover footnote
- &fn
- &nf \e"retain vertical size
- &fy \e"where fx put it
- &ef
- &&
- .P2
- .P1 .1i
- &nr b 1.0i \e"bottom margin size
- &wh 0 hd \e"header trap
- &wh 12i fo \e"footer trap->temp pos
- &wh -\e\enbu fx \e"fx at footer position
- &ch fo -\e\enbu \e"conceal fx with fo
- .P2
- .PP
- The header \&\f(CWhd\fR initializes a footnote count register \&\f(CWx\fR,
- and sets both the current footer trap position register \&\f(CWy\fR and
- the footer trap itself to a nominal position specified in
- register \&\f(CWb\fR.
- In addition, if the register \&\f(CWdn\fR indicates a leftover footnote,
- \&\f(CWfz\fR is invoked to reprocess it.
- The footnote start macro \&\f(CWfn\fR begins a diversion (append) in environment 1,
- and increments the count \&\f(CWx\fR; if the count is one, the footnote separator \&\f(CWfs\fR
- is interpolated.
- The separator is kept in a separate macro to permit user redefinition.
- .PP
- The footnote end macro \&\f(CWef\fR restores
- the previous environment and ends the diversion after saving the spacing size in register \&\f(CWz\fR.
- \&\f(CWy\fR is then decremented by the size of the footnote, available in \&\f(CWdn\fR;
- then on the first footnote, \&\f(CWy\fR is further decremented by the difference
- in vertical baseline spacings of the two environments, to
- prevent the late triggering of the footer trap from causing the last
- line of the combined footnotes to overflow.
- The footer trap is then set to the lower (on the page) of \&\f(CWy\fR or the current page position (\&\f(CWnl\fR)
- plus one line, to allow for printing the reference line.
- .PP
- If indicated by \&\f(CWx\fR, the footer \&\f(CWfo\fR rereads the footnotes from \&\f(CWFN\fR in nofill mode
- in environment 1,
- and deletes \&\f(CWFN\fR.
- If the footnotes were too large to fit, the macro \&\f(CWfx\fR will be trap-invoked to redivert
- the overflow into \&\f(CWfy\fR,
- and the register \&\f(CWdn\fR will later indicate to the header whether \&\f(CWfy\fR is empty.
- .PP
- Both \&\f(CWfo\fR and \&\f(CWfx\fR are planted in the nominal footer trap position in an order
- that causes \&\f(CWfx\fR to be concealed unless the \&\f(CWfo\fR trap is moved.
- The footer then terminates the overflow diversion, if necessary, and
- zeros \&\f(CWx\fR to disable \&\f(CWfx\fR,
- because the uncertainty correction
- together with a not-too-late triggering of the footer can result
- in the footnote rereading finishing before reaching the \&\f(CWfx\fR trap.
- .PP
- A good exercise for the student is to combine the multiple-column and footnote mechanisms.
- .SH
- The Last Page
- .PP
- After the last input file has ended, \*(NR and \*(TR
- invoke the \fIend macro\fR (§7), if any,
- and when it finishes, eject the remainder of the page.
- During the eject, any traps encountered are processed normally.
- At the end of this last page, processing terminates
- unless a partial line, word, or partial word remains.
- If it is desired that another page be started, the end-macro
- .P1 .1i
- &de en \e"end-macro
- \ec
- \&'bp
- &&
- &em en
- .P2
- will deposit a null partial word,
- and produce another last page.
- ....1C
- .sp 100
- .BP
- ........
- .TL
- Special Character Names
- .SP
- .PP
- The following table lists names for a set of characters,
- most of which have traditionally been provided by \*(TR using
- the `special' or `symbol' font.
- Many of these sequences are old ways to get what are now Unicode
- characters;
- Lucida Sans, for example, has glyphs corresponding to many of these
- but does not have the special sequences.
- Therefore
- the \*(TR sequence
- .CW \e(*F
- gives the character \(*F from the Times font instead of the
- character Φ from the current font, in this case Lucida Sans.
- Not all sequences print on any particular device, including this one; Peter
- faces appear in their place.
- .TS
- center;
- l l20fCW l l20fCW l l20fCW.
- \&\' \e' \(*m \e(*m \(~= \e(~=
- \` \e` \(*n \e(*n \(ap \e(ap
- \(em \e(em \(*c \e(*c \(!= \e(!=
- \(en \e(en \(*o \e(*o \(-> \e(->
- \(hy \e(hy \(*p \e(*p \(<- \e(<-
- \- \e- \(*r \e(*r \(ua \e(ua
- \(bu \e(bu \(*s \e(*s \(da \e(da
- \(sq \e(sq \(ts \e(ts \(mu \e(mu
- \(ru \e(ru \(*t \e(*t \(di \e(di
- \(14 \e(14 \(*u \e(*u \(+- \e(+-
- \(12 \e(12 \(*f \e(*f \(cu \e(cu
- \(34 \e(34 \(*x \e(*x \(ca \e(ca
- \(fi \e(fi \(*q \e(*q \(sb \e(sb
- \(fl \e(fl \(*w \e(*w \(sp \e(sp
- \(ff \e(ff \(*A \e(*A \(ib \e(ib
- \(Fi \e(Fi \(*B \e(*B \(ip \e(ip
- \(Fl \e(Fl \(*G \e(*G \(if \e(if
- \(de \e(de \(*D \e(*D \(pd \e(pd
- \(dg \e(dg \(*E \e(*E \(gr \e(gr
- \(fm \e(fm \(*Z \e(*Z \(no \e(no
- \(ct \e(ct \(*Y \e(*Y \(is \e(is
- \(rg \e(rg \(*H \e(*H \(pt \e(pt
- \(co \e(co \(*I \e(*I \(es \e(es
- \(pl \e(pl \(*K \e(*K \(mo \e(mo
- \(mi \e(mi \(*L \e(*L \(br \e(br
- \(eq \e(eq \(*M \e(*M \(dd \e(dd
- \(** \e(** \(*N \e(*N \(rh \e(rh
- \(sc \e(sc \(*C \e(*C \(lh \e(lh
- \(aa \e(aa \(*O \e(*O \(L1 \e(bs
- \(ga \e(ga \(*P \e(*P \(or \e(or
- \(ul \e(ul \(*R \e(*R \(ci \e(ci
- \(sl \e(sl \(*S \e(*S \(lt \e(lt
- \(*a \e(*a \(*T \e(*T \(lb \e(lb
- \(*b \e(*b \(*U \e(*U \(rt \e(rt
- \(*g \e(*g \(*F \e(*F \(rb \e(rb
- \(*d \e(*d \(*X \e(*X \(lk \e(lk
- \(*e \e(*e \(*Q \e(*Q \(rk \e(rk
- \(*z \e(*z \(*W \e(*W \(bv \e(bv
- \(*y \e(*y \(sr \e(sr \(lf \e(lf
- \(*h \e(*h \(rn \e(rn \(rf \e(rf
- \(*i \e(*i \(>= \e(>= \(lc \e(lc
- \(*k \e(*k \(<= \e(<= \(rc \e(rc
- \(*l \e(*l \(== \e(== \d\h'-5m'\(LH\u \e(LH
- .TE
|