texinfo.tex
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:184k
源码类别:

网络

开发平台:

Unix_Linux

  1. % texinfo.tex -- TeX macros to handle Texinfo files.
  2. %
  3. % Load plain if necessary, i.e., if running under initex.
  4. expandafterifxcsname fmtnameendcsnamerelaxinput plainfi
  5. %
  6. deftexinfoversion{1999-02-14.16}%
  7. %
  8. % Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
  9. % Free Software Foundation, Inc.
  10. %
  11. % This texinfo.tex file is free software; you can redistribute it and/or
  12. % modify it under the terms of the GNU General Public License as
  13. % published by the Free Software Foundation; either version 2, or (at
  14. % your option) any later version.
  15. %
  16. % This texinfo.tex file is distributed in the hope that it will be
  17. % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  18. % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19. % General Public License for more details.
  20. %
  21. % You should have received a copy of the GNU General Public License
  22. % along with this texinfo.tex file; see the file COPYING.  If not, write
  23. % to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  24. % Boston, MA 02111-1307, USA.
  25. %
  26. % In other words, you are welcome to use, share and improve this program.
  27. % You are forbidden to forbid anyone else to use, share and improve
  28. % what you give them.   Help stamp out software-hoarding!
  29. %
  30. % Please try the latest version of texinfo.tex before submitting bug
  31. % reports; you can get the latest version from:
  32. %   ftp://ftp.gnu.org/pub/gnu/texinfo.tex
  33. %   (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
  34. %   ftp://tug.org/tex/texinfo.tex
  35. %   ftp://ctan.org/macros/texinfo/texinfo.tex
  36. %   (and all CTAN mirrors, finger ctan@ctan.org for a list).
  37. %   /home/gd/gnu/doc/texinfo.tex on the GNU machines.
  38. % The texinfo.tex in any given Texinfo distribution could well be out
  39. % of date, so if that's what you're using, please check.
  40. % There is a small home page for Texinfo at http://texinfo.org/.
  41. %
  42. % Send bug reports to bug-texinfo@gnu.org.  Please include including a
  43. % complete document in each bug report with which we can reproduce the
  44. % problem.  Patches are, of course, greatly appreciated.
  45. %
  46. % To process a Texinfo manual with TeX, it's most reliable to use the
  47. % texi2dvi shell script that comes with the distribution.  For a simple
  48. % manual foo.texi, however, you can get away with this:
  49. %   tex foo.texi
  50. %   texindex foo.??
  51. %   tex foo.texi
  52. %   tex foo.texi
  53. %   dvips foo.dvi -o # or whatever, to process the dvi file; this makes foo.ps.
  54. % The extra runs of TeX get the cross-reference information correct.
  55. % Sometimes one run after texindex suffices, and sometimes you need more
  56. % than two; texi2dvi does it as many times as necessary.
  57. %
  58. % It is possible to adapt texinfo.tex for other languages.  You can get
  59. % the existing language-specific files from ftp://ftp.gnu.org/gnu/texinfo/.
  60. message{Loading texinfo [version texinfoversion]:}
  61. % If in a .fmt file, print the version number
  62. % and turn on active characters that we couldn't do earlier because
  63. % they might have appeared in the input file name.
  64. everyjob{message{[Texinfo version texinfoversion]}%
  65.   catcode`+=active catcode`_=active}
  66. % Save some parts of plain tex whose names we will redefine.
  67. letptexb=b
  68. letptexbullet=bullet
  69. letptexc=c
  70. letptexcomma=,
  71. letptexdot=.
  72. letptexdots=dots
  73. letptexend=end
  74. letptexequiv=equiv
  75. letptexexclam=!
  76. letptexi=i
  77. letptexlbrace={
  78. letptexrbrace=}
  79. letptexstar=*
  80. letptext=t
  81. % We never want plain's outer + definition in Texinfo.
  82. % For @tex, we can use tabalign.
  83. let+ = relax
  84. message{Basics,}
  85. chardefother=12
  86. % If this character appears in an error message or help string, it
  87. % starts a new line in the output.
  88. newlinechar = `^^J
  89. % Set up fixed words for English if not already set.
  90. ifxputwordAppendixundefined gdefputwordAppendix{Appendix}fi
  91. ifxputwordChapterundefined   gdefputwordChapter{Chapter}fi
  92. ifxputwordfileundefined      gdefputwordfile{file}fi
  93. ifxputwordIndexIsEmptyundefined     gdefputwordIndexIsEmpty{(Index is empty)}fi
  94. ifxputwordIndexNonexistentundefined gdefputwordIndexNonexistent{(Index is nonexistent)}fi
  95. ifxputwordInfoundefined      gdefputwordInfo{Info}fi
  96. ifxputwordMethodonundefined  gdefputwordMethodon{Method on}fi
  97. ifxputwordNoTitleundefined gdefputwordNoTitle{No Title}fi
  98. ifxputwordofundefined        gdefputwordof{of}fi
  99. ifxputwordonundefined        gdefputwordon{on}fi
  100. ifxputwordpageundefined      gdefputwordpage{page}fi
  101. ifxputwordsectionundefined   gdefputwordsection{section}fi
  102. ifxputwordSectionundefined   gdefputwordSection{Section}fi
  103. ifxputwordseeundefined       gdefputwordsee{see}fi
  104. ifxputwordSeeundefined       gdefputwordSee{See}fi
  105. ifxputwordShortTOCundefined gdefputwordShortTOC{Short Contents}fi
  106. ifxputwordTOCundefined gdefputwordTOC{Table of Contents}fi
  107. %
  108. ifxputwordMJanundefined gdefputwordMJan{January}fi
  109. ifxputwordMFebundefined gdefputwordMFeb{February}fi
  110. ifxputwordMMarundefined gdefputwordMMar{March}fi
  111. ifxputwordMAprundefined gdefputwordMApr{April}fi
  112. ifxputwordMMayundefined gdefputwordMMay{May}fi
  113. ifxputwordMJunundefined gdefputwordMJun{June}fi
  114. ifxputwordMJulundefined gdefputwordMJul{July}fi
  115. ifxputwordMAugundefined gdefputwordMAug{August}fi
  116. ifxputwordMSepundefined gdefputwordMSep{September}fi
  117. ifxputwordMOctundefined gdefputwordMOct{October}fi
  118. ifxputwordMNovundefined gdefputwordMNov{November}fi
  119. ifxputwordMDecundefined gdefputwordMDec{December}fi
  120. %
  121. ifxputwordDefmacundefined gdefputwordDefmac{Macro}fi
  122. ifxputwordDefspecundefined gdefputwordDefspec{Special Form}fi
  123. ifxputwordDefivarundefined gdefputwordDefivar{Instance Variable}fi
  124. ifxputwordDefvarundefined gdefputwordDefvar{Variable}fi
  125. ifxputwordDefoptundefined gdefputwordDefopt{User Option}fi
  126. ifxputwordDeftypevarundefinedgdefputwordDeftypevar{Variable}fi
  127. ifxputwordDeffuncundefined gdefputwordDeffunc{Function}fi
  128. ifxputwordDeftypefunundefinedgdefputwordDeftypefun{Function}fi
  129. % Ignore a token.
  130. %
  131. defgobble#1{}
  132. hyphenation{ap-pen-dix}
  133. hyphenation{mini-buf-fer mini-buf-fers}
  134. hyphenation{eshell}
  135. hyphenation{white-space}
  136. % Margin to add to right of even pages, to left of odd pages.
  137. newdimen bindingoffset
  138. newdimen normaloffset
  139. newdimenpagewidth newdimenpageheight
  140. % Sometimes it is convenient to have everything in the transcript file
  141. % and nothing on the terminal.  We don't just call tracingall here,
  142. % since that produces some useless output on the terminal.
  143. %
  144. defgloggingall{begingroup globaldefs = 1 loggingall endgroup}%
  145. ifxeTeXversionundefined
  146. defloggingall{tracingcommands2 tracingstats2
  147.    tracingpages1 tracingoutput1 tracinglostchars1
  148.    tracingmacros2 tracingparagraphs1 tracingrestores1
  149.    showboxbreadthmaxdimenshowboxdepthmaxdimen
  150. }%
  151. else
  152. defloggingall{tracingcommands3 tracingstats2
  153.    tracingpages1 tracingoutput1 tracinglostchars1
  154.    tracingmacros2 tracingparagraphs1 tracingrestores1
  155.    tracingscantokens1 tracingassigns1 tracingifs1
  156.    tracinggroups1 tracingnesting2
  157.    showboxbreadthmaxdimenshowboxdepthmaxdimen
  158. }%
  159. fi
  160. % For @cropmarks command.
  161. % Do @cropmarks to get crop marks.
  162. %
  163. newififcropmarks
  164. letcropmarks = cropmarkstrue
  165. %
  166. % Dimensions to add cropmarks at corners.
  167. % Added by P. A. MacKay, 12 Nov. 1986
  168. %
  169. newdimenouterhsize newdimenoutervsize % set by the paper size routines
  170. newdimencornerlong  cornerlong=1pc
  171. newdimencornerthick cornerthick=.3pt
  172. newdimentopandbottommargin topandbottommargin=.75in
  173. % Main output routine.
  174. chardefPAGE = 255
  175. output = {onepageout{pagecontentsPAGE}}
  176. newboxheadlinebox
  177. newboxfootlinebox
  178. % onepageout takes a vbox as an argument.  Note that pagecontents
  179. % does insertions, but you have to call it yourself.
  180. defonepageout#1{%
  181.   ifcropmarks hoffset=0pt else hoffset=normaloffset fi
  182.   %
  183.   ifoddpageno  advancehoffset by bindingoffset
  184.   else advancehoffset by -bindingoffsetfi
  185.   %
  186.   % Do this outside of the shipout so @code etc. will be expanded in
  187.   % the headline as they should be, not taken literally (outputting ''code).
  188.   setboxheadlinebox = vbox{lethsize=pagewidth makeheadline}%
  189.   setboxfootlinebox = vbox{lethsize=pagewidth makefootline}%
  190.   %
  191.   {%
  192.     % Have to do this stuff outside the shipout because we want it to
  193.     % take effect in write's, yet the group defined by the vbox ends
  194.     % before the shipout runs.
  195.     %
  196.     escapechar = `\     % use backslash in output files.
  197.     indexdummies         % don't expand commands in the output.
  198.     normalturnoffactive  %  in index entries must not stay , e.g., if
  199.                    % the page break happens to be in the middle of an example.
  200.     shipoutvbox{%
  201.       ifcropmarks vbox to outervsizebgroup
  202.         hsize = outerhsize
  203.         vskip-topandbottommargin
  204.         vtop to0pt{%
  205.           line{ewtophfilewtop}%
  206.           nointerlineskip
  207.           line{%
  208.             vbox{moveleftcornerthicknstop}%
  209.             hfill
  210.             vbox{moverightcornerthicknstop}%
  211.           }%
  212.           vss}%
  213.         vskiptopandbottommargin
  214.         linebgroup
  215.           hfil % center the page within the outer (page) hsize.
  216.           ifoddpagenohskipbindingoffsetfi
  217.           vboxbgroup
  218.       fi
  219.       %
  220.       unvboxheadlinebox
  221.       pagebody{#1}%
  222.       ifdimhtfootlinebox > 0pt
  223.         % Only leave this space if the footline is nonempty.
  224.         % (We lessened vsize for it in oddfootingxxx.)
  225.         % The baselineskip=24pt in plain's makefootline has no effect.
  226.         vskip 2baselineskip
  227.         unvboxfootlinebox
  228.       fi
  229.       %
  230.       ifcropmarks
  231.           egroup % end of vboxbgroup
  232.         hfilegroup % end of (centering) linebgroup
  233.         vskiptopandbottommargin plus1fill minus1fill
  234.         boxmaxdepth = cornerthick
  235.         vbox to0pt{vss
  236.           line{%
  237.             vbox{moveleftcornerthicknsbot}%
  238.             hfill
  239.             vbox{moverightcornerthicknsbot}%
  240.           }%
  241.           nointerlineskip
  242.           line{ewbothfilewbot}%
  243.         }%
  244.       egroup % vbox from first cropmarks clause
  245.       fi
  246.     }% end of shipoutvbox
  247.   }% end of group with turnoffactive
  248.   advancepageno
  249.   ifnumoutputpenalty>-20000 elsedosuperejectfi
  250. }
  251. newinsertmargin dimenmargin=maxdimen
  252. defpagebody#1{vbox topageheight{boxmaxdepth=maxdepth #1}}
  253. {catcode`@ =11
  254. gdefpagecontents#1{ifvoidtopinselseunvboxtopinsfi
  255. % marginal hacks, juha@viisa.uucp (Juha Takala)
  256. ifvoidmarginelse % marginal info is present
  257.   rlap{kernhsizevbox toz@{kern1ptboxmargin vss}}fi
  258. dimen@=dp#1 unvbox#1
  259. ifvoidfootinselsevskipskipfootinsfootnoterule unvboxfootinsfi
  260. ifr@ggedbottom kern-dimen@ vfil fi}
  261. }
  262. % Here are the rules for the cropmarks.  Note that they are
  263. % offset so that the space between them is truly outerhsize or outervsize
  264. % (P. A. MacKay, 12 November, 1986)
  265. %
  266. defewtop{vrule heightcornerthick depth0pt widthcornerlong}
  267. defnstop{vbox
  268.   {hrule heightcornerthick depthcornerlong widthcornerthick}}
  269. defewbot{vrule height0pt depthcornerthick widthcornerlong}
  270. defnsbot{vbox
  271.   {hrule heightcornerlong depthcornerthick widthcornerthick}}
  272. % Parse an argument, then pass it to #1.  The argument is the rest of
  273. % the input line (except we remove a trailing comment).  #1 should be a
  274. % macro which expects an ordinary undelimited TeX argument.
  275. %
  276. defparsearg#1{%
  277.   letnext = #1%
  278.   begingroup
  279.     obeylines
  280.     futurelettempparseargx
  281. }
  282. % If the next token is an obeyed space (from an @example environment or
  283. % the like), remove it and recurse.  Otherwise, we're done.
  284. defparseargx{%
  285.   % obeyedspace is defined far below, after the definition of sepspaces.
  286.   ifxobeyedspacetemp
  287.     expandafterparseargdiscardspace
  288.   else
  289.     expandafterparseargline
  290.   fi
  291. }
  292. % Remove a single space (as the delimiter token to the macro call).
  293. {obeyspaces %
  294.  gdefparseargdiscardspace {futurelettempparseargx}}
  295. {obeylines %
  296.   gdefparseargline#1^^M{%
  297.     endgroup % End of the group started in parsearg.
  298.     %
  299.     % First remove any @c comment, then any @comment.
  300.     % Result of each macro is put in toks0.
  301.     argremovec #1crelax %
  302.     expandafterargremovecomment thetoks0 commentrelax %
  303.     %
  304.     % Call the caller's macro, saved as next in parsearg.
  305.     expandafternextexpandafter{thetoks0}%
  306.   }%
  307. }
  308. % Since all c{,omment} does is throw away the argument, we can let TeX
  309. % do that for us.  The relax here is matched by the relax in the call
  310. % in parseargline; it could be more or less anything, its purpose is
  311. % just to delimit the argument to the c.
  312. defargremovec#1c#2relax{toks0 = {#1}}
  313. defargremovecomment#1comment#2relax{toks0 = {#1}}
  314. % argremovec{,omment} might leave us with trailing spaces, though; e.g.,
  315. %    @end itemize  @c foo
  316. % will have two active spaces as part of the argument with the
  317. % `itemize'.  Here we remove all active spaces from #1, and assign the
  318. % result to toks0.
  319. %
  320. % This loses if there are any *other* active characters besides spaces
  321. % in the argument -- _ ^ +, for example -- since they get expanded.
  322. % Fortunately, Texinfo does not define any such commands.  (If it ever
  323. % does, the catcode of the characters in questionwill have to be changed
  324. % here.)  But this means we cannot call removeactivespaces as part of
  325. % argremovec{,omment}, since @c uses parsearg, and thus the argument
  326. % that parsearg gets might well have any character at all in it.
  327. %
  328. defremoveactivespaces#1{%
  329.   begingroup
  330.     ignoreactivespaces
  331.     edeftemp{#1}%
  332.     globaltoks0 = expandafter{temp}%
  333.   endgroup
  334. }
  335. % Change the active space to expand to nothing.
  336. %
  337. begingroup
  338.   obeyspaces
  339.   gdefignoreactivespaces{obeyspaceslet =empty}
  340. endgroup
  341. defflushcr{ifxparlisppar defnext##1{}else letnext=relax fi next}
  342. %% These are used to keep @begin/@end levels from running away
  343. %% Call inENV within environments (after a begingroup)
  344. newififENV ENVfalse definENV{ifENVrelaxelseENVtruefi}
  345. defENVcheck{%
  346. ifENVerrmessage{Still within an environment; press RETURN to continue}
  347. endgroupfi} % This is not perfect, but it should reduce lossage
  348. % @begin foo  is the same as @foo, for now.
  349. newhelpEMsimple{Press RETURN to continue.}
  350. outerdefbegin{parseargbeginxxx}
  351. defbeginxxx #1{%
  352. expandafterifxcsname #1endcsnamerelax
  353. {errhelp=EMsimple errmessage{Undefined command @begin #1}}else
  354. csname #1endcsnamefi}
  355. % @end foo executes the definition of Efoo.
  356. %
  357. defend{parseargendxxx}
  358. defendxxx #1{%
  359.   removeactivespaces{#1}%
  360.   edefendthing{thetoks0}%
  361.   %
  362.   expandafterifxcsname Eendthingendcsnamerelax
  363.     expandafterifxcsname endthingendcsnamerelax
  364.       % There's no foo, i.e., no ``environment'' foo.
  365.       errhelp = EMsimple
  366.       errmessage{Undefined command `@end endthing'}%
  367.     else
  368.       unmatchedenderrorendthing
  369.     fi
  370.   else
  371.     % Everything's ok; the right environment has been started.
  372.     csname Eendthingendcsname
  373.   fi
  374. }
  375. % There is an environment #1, but it hasn't been started.  Give an error.
  376. %
  377. defunmatchedenderror#1{%
  378.   errhelp = EMsimple
  379.   errmessage{This `@end #1' doesn't have a matching `@#1'}%
  380. }
  381. % Define the control sequence E#1 to give an unmatched @end error.
  382. %
  383. defdefineunmatchedend#1{%
  384.   expandafterdefcsname E#1endcsname{unmatchedenderror{#1}}%
  385. }
  386. % Single-spacing is done by various environments (specifically, in
  387. % nonfillstart and quotations).
  388. newskipsinglespaceskip singlespaceskip = 12.5pt
  389. defsinglespace{%
  390.   % Why was this kern here?  It messes up equalizing space above and below
  391.   % environments.  --karl, 6may93
  392.   %{advance baselineskip by -singlespaceskip
  393.   %kern baselineskip}%
  394.   setleading singlespaceskip
  395. }
  396. %% Simple single-character @ commands
  397. % @@ prints an @
  398. % Kludge this until the fonts are right (grr).
  399. def@{{ttchar64}}
  400. % This is turned off because it was never documented
  401. % and you can use @w{...} around a quote to suppress ligatures.
  402. %% Define @` and @' to be the same as ` and '
  403. %% but suppressing ligatures.
  404. %def`{{`}}
  405. %def'{{'}}
  406. % Used to generate quoted braces.
  407. defmylbrace {{ttchar123}}
  408. defmyrbrace {{ttchar125}}
  409. let{=mylbrace
  410. let}=myrbrace
  411. begingroup
  412.   % Definitions to produce actual { & } command in an index.
  413.   catcode`{ = 12 catcode`} = 12
  414.   catcode`[ = 1 catcode`] = 2
  415.   catcode`@ = 0 catcode`\ = 12
  416.   @gdef@lbracecmd[{]%
  417.   @gdef@rbracecmd[}]%
  418. @endgroup
  419. % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
  420. % Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H.
  421. let, = c
  422. letdotaccent = .
  423. defringaccent#1{{accent23 #1}}
  424. lettieaccent = t
  425. letubaraccent = b
  426. letudotaccent = d
  427. % Other special characters: @questiondown @exclamdown
  428. % Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss.
  429. defquestiondown{?`}
  430. defexclamdown{!`}
  431. % Dotless i and dotless j, used for accents.
  432. defimacro{i}
  433. defjmacro{j}
  434. defdotless#1{%
  435.   deftemp{#1}%
  436.   ifxtempimacro ptexi
  437.   elseifxtempjmacro j
  438.   else errmessage{@dotless can be used only with i or j}%
  439.   fifi
  440. }
  441. % Be sure we're in horizontal mode when doing a tie, since we make space
  442. % equivalent to this in @example-like environments. Otherwise, a space
  443. % at the beginning of a line will start with penalty -- and
  444. % since penalty is valid in vertical mode, we'd end up putting the
  445. % penalty on the vertical list instead of in the new paragraph.
  446. {catcode`@ = 11
  447.  % Avoid using @M directly, because that causes trouble
  448.  % if the definition is written into an index file.
  449.  globallettiepenalty = @M
  450.  gdeftie{leavevmodepenaltytiepenalty }
  451. }
  452. % @: forces normal size whitespace following.
  453. def:{spacefactor=1000 }
  454. % @* forces a line break.
  455. def*{hfilbreakhbox{}ignorespaces}
  456. % @. is an end-of-sentence period.
  457. def.{.spacefactor=3000 }
  458. % @! is an end-of-sentence bang.
  459. def!{!spacefactor=3000 }
  460. % @? is an end-of-sentence query.
  461. def?{?spacefactor=3000 }
  462. % @w prevents a word break.  Without the leavevmode, @w at the
  463. % beginning of a paragraph, when TeX is still in vertical mode, would
  464. % produce a whole line of output instead of starting the paragraph.
  465. defw#1{leavevmodehbox{#1}}
  466. % @group ... @end group forces ... to be all on one page, by enclosing
  467. % it in a TeX vbox.  We use vtop instead of vbox to construct the box
  468. % to keep its height that of a normal line.  According to the rules for
  469. % topskip (p.114 of the TeXbook), the glue inserted is
  470. % max (topskip - ht (first item), 0).  If that height is large,
  471. % therefore, no glue is inserted, and the space between the headline and
  472. % the text is small, which looks bad.
  473. %
  474. defgroup{begingroup
  475.   ifnumcatcode13=active else
  476.     errhelp = groupinvalidhelp
  477.     errmessage{@group invalid in context where filling is enabled}%
  478.   fi
  479.   %
  480.   % The vtop we start below produces a box with normal height and large
  481.   % depth; thus, TeX puts baselineskip glue before it, and (when the
  482.   % next line of text is done) lineskip glue after it.  (See p.82 of
  483.   % the TeXbook.)  Thus, space below is not quite equal to space
  484.   % above.  But it's pretty close.
  485.   defEgroup{%
  486.     egroup           % End the vtop.
  487.     endgroup         % End the group.
  488.   }%
  489.   %
  490.   vtopbgroup
  491.     % We have to put a strut on the last line in case the @group is in
  492.     % the midst of an example, rather than completely enclosing it.
  493.     % Otherwise, the interline space between the last line of the group
  494.     % and the first line afterwards is too small.  But we can't put the
  495.     % strut in Egroup, since there it would be on a line by itself.
  496.     % Hence this just inserts a strut at the beginning of each line.
  497.     everypar = {strut}%
  498.     %
  499.     % Since we have a strut on every line, we don't need any of TeX's
  500.     % normal interline spacing.
  501.     offinterlineskip
  502.     %
  503.     % OK, but now we have to do something about blank
  504.     % lines in the input in @example-like environments, which normally
  505.     % just turn into lisppar, which will insert no space now that we've
  506.     % turned off the interline space.  Simplest is to make them be an
  507.     % empty paragraph.
  508.     ifxparlisppar
  509.       edefpar{leavevmode par}%
  510.       %
  511.       % Reset ^^M's definition to new definition of par.
  512.       obeylines
  513.     fi
  514.     %
  515.     % Do @comment since we are called inside an environment such as
  516.     % @example, where each end-of-line in the input causes an
  517.     % end-of-line in the output.  We don't want the end-of-line after
  518.     % the `@group' to put extra space in the output.  Since @group
  519.     % should appear on a line by itself (according to the Texinfo
  520.     % manual), we don't worry about eating any user text.
  521.     comment
  522. }
  523. %
  524. % TeX puts in an escapechar (i.e., `@') at the beginning of the help
  525. % message, so this ends up printing `@group can only ...'.
  526. %
  527. newhelpgroupinvalidhelp{%
  528. group can only be used in environments such as @example,^^J%
  529. where each line of input produces a line of output.}
  530. % @need space-in-mils
  531. % forces a page break if there is not space-in-mils remaining.
  532. newdimenmil  mil=0.001in
  533. defneed{parseargneedx}
  534. % Old definition--didn't work.
  535. %defneedx #1{par %
  536. %% This method tries to make TeX break the page naturally
  537. %% if the depth of the box does not fit.
  538. %{baselineskip=0pt%
  539. %vtop to #1mil{vfil}kern -#1milnobreak
  540. %prevdepth=-1000pt
  541. %}}
  542. defneedx#1{%
  543.   % Go into vertical mode, so we don't make a big box in the middle of a
  544.   % paragraph.
  545.   par
  546.   %
  547.   % Don't add any leading before our big empty box, but allow a page
  548.   % break, since the best break might be right here.
  549.   allowbreak
  550.   nointerlineskip
  551.   vtop to #1mil{vfil}%
  552.   %
  553.   % TeX does not even consider page breaks if a penalty added to the
  554.   % main vertical list is 10000 or more.  But in order to see if the
  555.   % empty box we just added fits on the page, we must make it consider
  556.   % page breaks.  On the other hand, we don't want to actually break the
  557.   % page after the empty box.  So we use a penalty of 9999.
  558.   %
  559.   % There is an extremely small chance that TeX will actually break the
  560.   % page at this penalty, if there are no other feasible breakpoints in
  561.   % sight.  (If the user is using lots of big @group commands, which
  562.   % almost-but-not-quite fill up a page, TeX will have a hard time doing
  563.   % good page breaking, for example.)  However, I could not construct an
  564.   % example where a page broke at this penalty; if it happens in a real
  565.   % document, then we can reconsider our strategy.
  566.   penalty9999
  567.   %
  568.   % Back up by the size of the box, whether we did a page break or not.
  569.   kern -#1mil
  570.   %
  571.   % Do not allow a page break right after this kern.
  572.   nobreak
  573. }
  574. % @br   forces paragraph break
  575. letbr = par
  576. % @dots{} output an ellipsis using the current font.
  577. % We do .5em per period so that it has the same spacing in a typewriter
  578. % font as three actual period characters.
  579. %
  580. defdots{%
  581.   leavevmode
  582.   hbox to 1.5em{%
  583.     hskip 0pt plus 0.25fil minus 0.25fil
  584.     .hss.hss.%
  585.     hskip 0pt plus 0.5fil minus 0.5fil
  586.   }%
  587. }
  588. % @enddots{} is an end-of-sentence ellipsis.
  589. %
  590. defenddots{%
  591.   leavevmode
  592.   hbox to 2em{%
  593.     hskip 0pt plus 0.25fil minus 0.25fil
  594.     .hss.hss.hss.%
  595.     hskip 0pt plus 0.5fil minus 0.5fil
  596.   }%
  597.   spacefactor=3000
  598. }
  599. % @page    forces the start of a new page
  600. %
  601. defpage{parvfillsupereject}
  602. % @exdent text....
  603. % outputs text on separate line in roman font, starting at standard page margin
  604. % This records the amount of indent in the innermost environment.
  605. % That's how much exdent should take out.
  606. newskipexdentamount
  607. % This defn is used inside fill environments such as @defun.
  608. defexdent{parseargexdentyyy}
  609. defexdentyyy #1{{hfilbreakhbox{kern -exdentamount{rm#1}}hfilbreak}}
  610. % This defn is used inside nofill environments such as @example.
  611. defnofillexdent{parseargnofillexdentyyy}
  612. defnofillexdentyyy #1{{advance leftskip by -exdentamount
  613. leftline{hskipleftskip{rm#1}}}}
  614. % @inmargin{TEXT} puts TEXT in the margin next to the current paragraph.
  615. definmargin#1{%
  616. strutvadjust{nobreakkern-strutdepth
  617.   vtop to strutdepth{baselineskipstrutdepthvss
  618.   llap{rightskip=inmarginspacing vbox{noindent #1}}null}}}
  619. newskipinmarginspacing inmarginspacing=1cm
  620. defstrutdepth{dpstrutbox}
  621. %hbox{{rm#1}}hfilbreak}}
  622. % @include file    insert text of that file as input.
  623. % Allow normal characters that  we make active in the argument (a file name).
  624. definclude{begingroup
  625.   catcode`\=12
  626.   catcode`~=12
  627.   catcode`^=12
  628.   catcode`_=12
  629.   catcode`|=12
  630.   catcode`<=12
  631.   catcode`>=12
  632.   catcode`+=12
  633.   parseargincludezzz}
  634. % Restore active chars for included file.
  635. defincludezzz#1{endgroupbegingroup
  636.   % Read the included file in a group so nested @include's work.
  637.   defthisfile{#1}%
  638.   inputthisfile
  639. endgroup}
  640. defthisfile{}
  641. % @center line   outputs that line, centered
  642. defcenter{parseargcenterzzz}
  643. defcenterzzz #1{{advancehsize by -leftskip
  644. advancehsize by -rightskip
  645. centerline{#1}}}
  646. % @sp n   outputs n lines of vertical space
  647. defsp{parseargspxxx}
  648. defspxxx #1{vskip #1baselineskip}
  649. % @comment ...line which is ignored...
  650. % @c is the same as @comment
  651. % @ignore ... @end ignore  is another way to write a comment
  652. defcomment{begingroup catcode`^^M=other%
  653. catcode`@=other catcode`{=other catcode`}=other%
  654. commentxxx}
  655. {catcode`^^M=other gdefcommentxxx#1^^M{endgroup}}
  656. letc=comment
  657. % @paragraphindent NCHARS
  658. % We'll use ems for NCHARS, close enough.
  659. % We cannot implement @paragraphindent asis, though.
  660. defasisword{asis} % no translation, these are keywords
  661. defnoneword{none}
  662. %
  663. defparagraphindent{parseargdoparagraphindent}
  664. defdoparagraphindent#1{%
  665.   deftemp{#1}%
  666.   ifxtempasisword
  667.   else
  668.     ifxtempnoneword
  669.       defaultparindent = 0pt
  670.     else
  671.       defaultparindent = #1em
  672.     fi
  673.   fi
  674.   parindent = defaultparindent
  675. }
  676. % @asis just yields its argument.  Used with @table, for example.
  677. %
  678. defasis#1{#1}
  679. % @math means output in math mode.
  680. % We don't use $'s directly in the definition of math because control
  681. % sequences like math are expanded when the toc file is written.  Then,
  682. % we read the toc file back, the $'s will be normal characters (as they
  683. % should be, according to the definition of Texinfo).  So we must use a
  684. % control sequence to switch into and out of math mode.
  685. %
  686. % This isn't quite enough for @math to work properly in indices, but it
  687. % seems unlikely it will ever be needed there.
  688. %
  689. letimplicitmath = $
  690. defmath#1{implicitmath #1implicitmath}
  691. % @bullet and @minus need the same treatment as @math, just above.
  692. defbullet{implicitmathptexbulletimplicitmath}
  693. defminus{implicitmath-implicitmath}
  694. % @refill is a no-op.
  695. letrefill=relax
  696. % If working on a large document in chapters, it is convenient to
  697. % be able to disable indexing, cross-referencing, and contents, for test runs.
  698. % This is done with @novalidate (before @setfilename).
  699. %
  700. newififlinks linkstrue % by default we want the aux files.
  701. letnovalidate = linksfalse
  702. % @setfilename is done at the beginning of every texinfo file.
  703. % So open here the files we need to have open while reading the input.
  704. % This makes it possible to make a .fmt file for texinfo.
  705. defsetfilename{%
  706.    iflinks
  707.      readauxfile
  708.    fi % openindices needs to do some work in any case.
  709.    openindices
  710.    fixbackslash  % Turn off hack to swallow `input texinfo'.
  711.    globalletsetfilename=comment % Ignore extra @setfilename cmds.
  712.    %
  713.    % If texinfo.cnf is present on the system, read it.
  714.    % Useful for site-wide @afourpaper, etc.
  715.    % Just to be on the safe side, close the input stream before the input.
  716.    openin 1 texinfo.cnf
  717.    ifeof1 lettemp=relax else deftemp{input texinfo.cnf }fi
  718.    closein1
  719.    temp
  720.    %
  721.    comment % Ignore the actual filename.
  722. }
  723. % Called from setfilename.
  724. %
  725. defopenindices{%
  726.   newindex{cp}%
  727.   newcodeindex{fn}%
  728.   newcodeindex{vr}%
  729.   newcodeindex{tp}%
  730.   newcodeindex{ky}%
  731.   newcodeindex{pg}%
  732. }
  733. % @bye.
  734. outerdefbye{pagealignmacrotracingstats=1ptexend}
  735. message{fonts,}
  736. % Font-change commands.
  737. % Texinfo sort of supports the sans serif font style, which plain TeX does not.
  738. % So we set up a sf analogous to plain's rm, etc.
  739. newfamsffam
  740. defsf{fam=sffam tensf}
  741. letli = sf % Sometimes we call it li, not sf.
  742. % We don't need math for this one.
  743. defttsl{tenttsl}
  744. % Use Computer Modern fonts at magstephalf (11pt).
  745. newcountmainmagstep
  746. mainmagstep=magstephalf
  747. % Set the font macro #1 to the font named #2, adding on the
  748. % specified font prefix (normally `cm').
  749. % #3 is the font's design size, #4 is a scale factor
  750. defsetfont#1#2#3#4{font#1=fontprefix#2#3 scaled #4}
  751. % Use cm as the default font prefix.
  752. % To specify the font prefix, you must define fontprefix
  753. % before you read in texinfo.tex.
  754. ifxfontprefixundefined
  755. deffontprefix{cm}
  756. fi
  757. % Support font families that don't use the same naming scheme as CM.
  758. defrmshape{r}
  759. defrmbshape{bx}               %where the normal face is bold
  760. defbfshape{b}
  761. defbxshape{bx}
  762. defttshape{tt}
  763. defttbshape{tt}
  764. defttslshape{sltt}
  765. defitshape{ti}
  766. defitbshape{bxti}
  767. defslshape{sl}
  768. defslbshape{bxsl}
  769. defsfshape{ss}
  770. defsfbshape{ss}
  771. defscshape{csc}
  772. defscbshape{csc}
  773. ifxbiggerrelax
  774. letmainmagstep=magstep1
  775. setfonttextrmrmshape{12}{1000}
  776. setfonttextttttshape{12}{1000}
  777. else
  778. setfonttextrmrmshape{10}{mainmagstep}
  779. setfonttextttttshape{10}{mainmagstep}
  780. fi
  781. % Instead of cmb10, you many want to use cmbx10.
  782. % cmbx10 is a prettier font on its own, but cmb10
  783. % looks better when embedded in a line with cmr10.
  784. setfonttextbfbfshape{10}{mainmagstep}
  785. setfonttextititshape{10}{mainmagstep}
  786. setfonttextslslshape{10}{mainmagstep}
  787. setfonttextsfsfshape{10}{mainmagstep}
  788. setfonttextscscshape{10}{mainmagstep}
  789. setfonttextttslttslshape{10}{mainmagstep}
  790. fonttexti=cmmi10 scaled mainmagstep
  791. fonttextsy=cmsy10 scaled mainmagstep
  792. % A few fonts for @defun, etc.
  793. setfontdefbfbxshape{10}{magstep1} %was 1314
  794. setfontdefttttshape{10}{magstep1}
  795. defdf{lettentt=deftt lettenbf = defbf bf}
  796. % Fonts for indices and small examples (9pt).
  797. % We actually use the slanted font rather than the italic,
  798. % because texinfo normally uses the slanted fonts for that.
  799. % Do not make many font distinctions in general in the index, since they
  800. % aren't very useful.
  801. setfontninettttshape{9}{1000}
  802. setfontninettslttslshape{10}{900}
  803. setfontindrmrmshape{9}{1000}
  804. setfontindititshape{9}{1000}
  805. setfontindslslshape{9}{1000}
  806. letindtt=ninett
  807. letindttsl=ninettsl
  808. letindsf=indrm
  809. letindbf=indrm
  810. setfontindscscshape{10}{900}
  811. fontindi=cmmi9
  812. fontindsy=cmsy9
  813. % Fonts for title page:
  814. setfonttitlermrmbshape{12}{magstep3}
  815. setfonttitleititbshape{10}{magstep4}
  816. setfonttitleslslbshape{10}{magstep4}
  817. setfonttitlettttbshape{12}{magstep3}
  818. setfonttitlettslttslshape{10}{magstep4}
  819. setfonttitlesfsfbshape{17}{magstep1}
  820. lettitlebf=titlerm
  821. setfonttitlescscbshape{10}{magstep4}
  822. fonttitlei=cmmi12 scaled magstep3
  823. fonttitlesy=cmsy10 scaled magstep4
  824. defauthorrm{secrm}
  825. % Chapter (and unnumbered) fonts (17.28pt).
  826. setfontchaprmrmbshape{12}{magstep2}
  827. setfontchapititbshape{10}{magstep3}
  828. setfontchapslslbshape{10}{magstep3}
  829. setfontchapttttbshape{12}{magstep2}
  830. setfontchapttslttslshape{10}{magstep3}
  831. setfontchapsfsfbshape{17}{1000}
  832. letchapbf=chaprm
  833. setfontchapscscbshape{10}{magstep3}
  834. fontchapi=cmmi12 scaled magstep2
  835. fontchapsy=cmsy10 scaled magstep3
  836. % Section fonts (14.4pt).
  837. setfontsecrmrmbshape{12}{magstep1}
  838. setfontsecititbshape{10}{magstep2}
  839. setfontsecslslbshape{10}{magstep2}
  840. setfontsecttttbshape{12}{magstep1}
  841. setfontsecttslttslshape{10}{magstep2}
  842. setfontsecsfsfbshape{12}{magstep1}
  843. letsecbfsecrm
  844. setfontsecscscbshape{10}{magstep2}
  845. fontseci=cmmi12 scaled magstep1
  846. fontsecsy=cmsy10 scaled magstep2
  847. % setfontssecrmbxshape{10}{magstep1}    % This size an font looked bad.
  848. % setfontssecititshape{10}{magstep1}    % The letters were too crowded.
  849. % setfontssecslslshape{10}{magstep1}
  850. % setfontssecttttshape{10}{magstep1}
  851. % setfontssecsfsfshape{10}{magstep1}
  852. %setfontssecrmbfshape{10}{1315}      % Note the use of cmb rather than cmbx.
  853. %setfontssecititshape{10}{1315}      % Also, the size is a little larger than
  854. %setfontssecslslshape{10}{1315}      % being scaled magstep1.
  855. %setfontssecttttshape{10}{1315}
  856. %setfontssecsfsfshape{10}{1315}
  857. %letssecbf=ssecrm
  858. % Subsection fonts (13.15pt).
  859. setfontssecrmrmbshape{12}{magstephalf}
  860. setfontssecititbshape{10}{1315}
  861. setfontssecslslbshape{10}{1315}
  862. setfontssecttttbshape{12}{magstephalf}
  863. setfontssecttslttslshape{10}{1315}
  864. setfontssecsfsfbshape{12}{magstephalf}
  865. letssecbfssecrm
  866. setfontssecscscbshape{10}{magstep1}
  867. fontsseci=cmmi12 scaled magstephalf
  868. fontssecsy=cmsy10 scaled 1315
  869. % The smallcaps and symbol fonts should actually be scaled magstep1.5,
  870. % but that is not a standard magnification.
  871. % In order for the font changes to affect most math symbols and letters,
  872. % we have to define the textfont of the standard families.  Since
  873. % texinfo doesn't allow for producing subscripts and superscripts, we
  874. % don't bother to reset scriptfont and scriptscriptfont (which would
  875. % also require loading a lot more fonts).
  876. %
  877. defresetmathfonts{%
  878.   textfont0 = tenrm textfont1 = teni textfont2 = tensy
  879.   textfontitfam = tenit textfontslfam = tensl textfontbffam = tenbf
  880.   textfontttfam = tentt textfontsffam = tensf
  881. }
  882. % The font-changing commands redefine the meanings of tenSTYLE, instead
  883. % of just STYLE.  We do this so that font changes will continue to work
  884. % in math mode, where it is the current fam that is relevant in most
  885. % cases, not the current font.  Plain TeX does defbf{fam=bffam
  886. % tenbf}, for example.  By redefining tenbf, we obviate the need to
  887. % redefine bf itself.
  888. deftextfonts{%
  889.   lettenrm=textrm lettenit=textit lettensl=textsl
  890.   lettenbf=textbf lettentt=texttt letsmallcaps=textsc
  891.   lettensf=textsf letteni=texti lettensy=textsy lettenttsl=textttsl
  892.   resetmathfonts}
  893. deftitlefonts{%
  894.   lettenrm=titlerm lettenit=titleit lettensl=titlesl
  895.   lettenbf=titlebf lettentt=titlett letsmallcaps=titlesc
  896.   lettensf=titlesf letteni=titlei lettensy=titlesy
  897.   lettenttsl=titlettsl
  898.   resetmathfonts setleading{25pt}}
  899. deftitlefont#1{{titlefontsrm #1}}
  900. defchapfonts{%
  901.   lettenrm=chaprm lettenit=chapit lettensl=chapsl
  902.   lettenbf=chapbf lettentt=chaptt letsmallcaps=chapsc
  903.   lettensf=chapsf letteni=chapi lettensy=chapsy lettenttsl=chapttsl
  904.   resetmathfonts setleading{19pt}}
  905. defsecfonts{%
  906.   lettenrm=secrm lettenit=secit lettensl=secsl
  907.   lettenbf=secbf lettentt=sectt letsmallcaps=secsc
  908.   lettensf=secsf letteni=seci lettensy=secsy lettenttsl=secttsl
  909.   resetmathfonts setleading{16pt}}
  910. defsubsecfonts{%
  911.   lettenrm=ssecrm lettenit=ssecit lettensl=ssecsl
  912.   lettenbf=ssecbf lettentt=ssectt letsmallcaps=ssecsc
  913.   lettensf=ssecsf letteni=sseci lettensy=ssecsy lettenttsl=ssecttsl
  914.   resetmathfonts setleading{15pt}}
  915. letsubsubsecfonts = subsecfonts % Maybe make sssec fonts scaled magstephalf?
  916. defindexfonts{%
  917.   lettenrm=indrm lettenit=indit lettensl=indsl
  918.   lettenbf=indbf lettentt=indtt letsmallcaps=indsc
  919.   lettensf=indsf letteni=indi lettensy=indsy lettenttsl=indttsl
  920.   resetmathfonts setleading{12pt}}
  921. % Set up the default fonts, so we can use them for creating boxes.
  922. %
  923. textfonts
  924. % Define these so they can be easily changed for other fonts.
  925. defangleleft{$langle$}
  926. defangleright{$rangle$}
  927. % Count depth in font-changes, for error checks
  928. newcountfontdepth fontdepth=0
  929. % Fonts for short table of contents.
  930. setfontshortcontrmrmshape{12}{1000}
  931. setfontshortcontbfbxshape{12}{1000}
  932. setfontshortcontslslshape{12}{1000}
  933. %% Add scribe-like font environments, plus @l for inline lisp (usually sans
  934. %% serif) and @ii for TeX italic
  935. % smartitalic{ARG} outputs arg in italics, followed by an italic correction
  936. % unless the following character is such as not to need one.
  937. defsmartitalicx{ifxnext,elseifxnext-elseifxnext.else/fififi}
  938. defsmartslanted#1{{sl #1}futureletnextsmartitalicx}
  939. defsmartitalic#1{{it #1}futureletnextsmartitalicx}
  940. leti=smartitalic
  941. letvar=smartslanted
  942. letdfn=smartslanted
  943. letemph=smartitalic
  944. letcite=smartslanted
  945. defb#1{{bf #1}}
  946. letstrong=b
  947. % We can't just use exhyphenpenalty, because that only has effect at
  948. % the end of a paragraph.  Restore normal hyphenation at the end of the
  949. % group within which nohyphenation is presumably called.
  950. %
  951. defnohyphenation{hyphencharfont = -1  aftergrouprestorehyphenation}
  952. defrestorehyphenation{hyphencharfont = `- }
  953. deft#1{%
  954.   {tt rawbackslash frenchspacing #1}%
  955.   null
  956. }
  957. letttfont=t
  958. defsamp#1{`tclose{#1}'null}
  959. setfontsmallrmrmshape{8}{1000}
  960. fontsmallsy=cmsy9
  961. defkey#1{{smallrmtextfont2=smallsy leavevmodehbox{%
  962.   raise0.4pthbox{angleleft}kern-.08emvtop{%
  963.     vbox{hrulekern-0.4pt
  964.      hbox{raise0.4pthbox{vphantom{angleleft}}#1}}%
  965.     kern-0.4pthrule}%
  966.   kern-.06emraise0.4pthbox{angleright}}}}
  967. % The old definition, with no lozenge:
  968. %defkey #1{{ttsl nohyphenation uppercase{#1}}null}
  969. defctrl #1{{tt rawbackslash hat}#1}
  970. % @file, @option are the same as @samp.
  971. letfile=samp
  972. letoption=samp
  973. % @code is a modification of @t,
  974. % which makes spaces the same size as normal in the surrounding text.
  975. deftclose#1{%
  976.   {%
  977.     % Change normal interword space to be same as for the current font.
  978.     spaceskip = fontdimen2font
  979.     %
  980.     % Switch to typewriter.
  981.     tt
  982.     %
  983.     % But ` ' produces the large typewriter interword space.
  984.     def {{spaceskip = 0pt{} }}%
  985.     %
  986.     % Turn off hyphenation.
  987.     nohyphenation
  988.     %
  989.     rawbackslash
  990.     frenchspacing
  991.     #1%
  992.   }%
  993.   null
  994. }
  995. % We *must* turn on hyphenation at `-' and `_' in code.
  996. % Otherwise, it is too hard to avoid overfull hboxes
  997. % in the Emacs manual, the Library manual, etc.
  998. % Unfortunately, TeX uses one parameter (hyphenchar) to control
  999. % both hyphenation at - and hyphenation within words.
  1000. % We must therefore turn them both off (tclose does that)
  1001. % and arrange explicitly to hyphenate at a dash.
  1002. %  -- rms.
  1003. {
  1004.   catcode`-=active
  1005.   catcode`_=active
  1006.   %
  1007.   globaldefcode{begingroup
  1008.     catcode`-=active let-codedash
  1009.     catcode`_=active let_codeunder
  1010.     codex
  1011.   }
  1012.   %
  1013.   % If we end up with any active - characters when handling the index,
  1014.   % just treat them as a normal -.
  1015.   globaldefindexbreaks{catcode`-=active let-realdash}
  1016. }
  1017. defrealdash{-}
  1018. defcodedash{-discretionary{}{}{}}
  1019. defcodeunder{ifusingtt{normalunderscorediscretionary{}{}{}}{_}}
  1020. defcodex #1{tclose{#1}endgroup}
  1021. %letexp=tclose  %Was temporary
  1022. % @kbd is like @code, except that if the argument is just one @key command,
  1023. % then @kbd has no effect.
  1024. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
  1025. %   `example' (@kbd uses ttsl only inside of @example and friends),
  1026. %   or `code' (@kbd uses normal tty font always).
  1027. defkbdinputstyle{parseargkbdinputstylexxx}
  1028. defkbdinputstylexxx#1{%
  1029.   defarg{#1}%
  1030.   ifxargworddistinct
  1031.     gdefkbdexamplefont{ttsl}gdefkbdfont{ttsl}%
  1032.   elseifxargwordexample
  1033.     gdefkbdexamplefont{ttsl}gdefkbdfont{tt}%
  1034.   elseifxargwordcode
  1035.     gdefkbdexamplefont{tt}gdefkbdfont{tt}%
  1036.   fififi
  1037. }
  1038. defworddistinct{distinct}
  1039. defwordexample{example}
  1040. defwordcode{code}
  1041. % Default is kbdinputdistinct.  (Too much of a hassle to call the macro,
  1042. % the catcodes are wrong for parsearg to work.)
  1043. gdefkbdexamplefont{ttsl}gdefkbdfont{ttsl}
  1044. defxkey{key}
  1045. defkbdfoo#1#2#3par{defone{#1}defthree{#3}defthreex{??}%
  1046. ifxonexkeyifxthreexthree key{#2}%
  1047. else{tclose{kbdfontlook}}fi
  1048. else{tclose{kbdfontlook}}fi}
  1049. % For @url, @env, @command quotes seem unnecessary, so use code.
  1050. leturl=code
  1051. letenv=code
  1052. letcommand=code
  1053. % @uref (abbreviation for `urlref') takes an optional (comma-separated)
  1054. % second argument specifying the text to display and an optional third
  1055. % arg as text to display instead of (rather than in addition to) the url
  1056. % itself.  First (mandatory) arg is the url.  Perhaps eventually put in
  1057. % a hypertex special here.
  1058. %
  1059. defuref#1{douref #1,,,finish}
  1060. defdouref#1,#2,#3,#4finish{%
  1061.   setbox0 = hbox{ignorespaces #3}%
  1062.   ifdimwd0 > 0pt
  1063.     unhbox0 % third arg given, show only that
  1064.   else
  1065.     setbox0 = hbox{ignorespaces #2}%
  1066.     ifdimwd0 > 0pt
  1067.       unhbox0 (code{#1})% second arg given, show both it and url
  1068.     else
  1069.       code{#1}% only url given, so show it
  1070.     fi
  1071.   fi
  1072. }
  1073. % rms does not like the angle brackets --karl, 17may97.
  1074. % So now @email is just like @uref.
  1075. %defemail#1{angleleft{tt #1}angleright}
  1076. letemail=uref
  1077. % Check if we are currently using a typewriter font.  Since all the
  1078. % Computer Modern typewriter fonts have zero interword stretch (and
  1079. % shrink), and it is reasonable to expect all typewriter fonts to have
  1080. % this property, we can check that font parameter.
  1081. %
  1082. defifmonospace{ifdimfontdimen3font=0pt }
  1083. % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
  1084. % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
  1085. %
  1086. defdmn#1{thinspace #1}
  1087. defkbd#1{deflook{#1}expandafterkbdfoolook??par}
  1088. % @l was never documented to mean ``switch to the Lisp font'',
  1089. % and it is not used as such in any manual I can find.  We need it for
  1090. % Polish suppressed-l.  --karl, 22sep96.
  1091. %defl#1{{li #1}null}
  1092. % Explicit font changes: @r, @sc, undocumented @ii.
  1093. defr#1{{rm #1}}              % roman font
  1094. defsc#1{{smallcaps#1}}       % smallcaps font
  1095. defii#1{{it #1}}             % italic font
  1096. % @acronym downcases the argument and prints in smallcaps.
  1097. defacronym#1{{smallcaps lowercase{#1}}}
  1098. % @pounds{} is a sterling sign.
  1099. defpounds{{it$}}
  1100. message{page headings,}
  1101. newskiptitlepagetopglue titlepagetopglue = 1.5in
  1102. newskiptitlepagebottomglue titlepagebottomglue = 2pc
  1103. % First the title page.  Must do @settitle before @titlepage.
  1104. newififseenauthor
  1105. newififfinishedtitlepage
  1106. % Do an implicit @contents or @shortcontents after @end titlepage if the
  1107. % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
  1108. %
  1109. newififsetcontentsaftertitlepage
  1110.  letsetcontentsaftertitlepage = setcontentsaftertitlepagetrue
  1111. newififsetshortcontentsaftertitlepage
  1112.  letsetshortcontentsaftertitlepage = setshortcontentsaftertitlepagetrue
  1113. defshorttitlepage{parseargshorttitlepagezzz}
  1114. defshorttitlepagezzz #1{begingrouphbox{}vskip 1.5in chaprm centerline{#1}%
  1115.         endgrouppagehbox{}page}
  1116. deftitlepage{begingroup parindent=0pt textfonts
  1117.    letsubtitlerm=tenrm
  1118.    defsubtitlefont{subtitlerm normalbaselineskip = 13pt normalbaselines}%
  1119.    %
  1120.    defauthorfont{authorrm normalbaselineskip = 16pt normalbaselines}%
  1121.    %
  1122.    % Leave some space at the very top of the page.
  1123.    vgluetitlepagetopglue
  1124.    %
  1125.    % Now you can print the title using @title.
  1126.    deftitle{parseargtitlezzz}%
  1127.    deftitlezzz##1{leftline{titlefontsrm ##1}
  1128.                     % print a rule at the page bottom also.
  1129.                     finishedtitlepagefalse
  1130.                     vskip4pt hrule height 4pt width hsize vskip4pt}%
  1131.    % No rule at page bottom unless we print one at the top with @title.
  1132.    finishedtitlepagetrue
  1133.    %
  1134.    % Now you can put text using @subtitle.
  1135.    defsubtitle{parseargsubtitlezzz}%
  1136.    defsubtitlezzz##1{{subtitlefont rightline{##1}}}%
  1137.    %
  1138.    % @author should come last, but may come many times.
  1139.    defauthor{parseargauthorzzz}%
  1140.    defauthorzzz##1{ifseenauthorelsevskip 0pt plus 1filllseenauthortruefi
  1141.       {authorfont leftline{##1}}}%
  1142.    %
  1143.    % Most title ``pages'' are actually two pages long, with space
  1144.    % at the top of the second.  We don't want the ragged left on the second.
  1145.    letoldpage = page
  1146.    defpage{%
  1147.       iffinishedtitlepageelse
  1148.          finishtitlepage
  1149.       fi
  1150.       oldpage
  1151.       letpage = oldpage
  1152.       hbox{}}%
  1153. %   defpage{oldpage hbox{}}
  1154. }
  1155. defEtitlepage{%
  1156.    iffinishedtitlepageelse
  1157.       finishtitlepage
  1158.    fi
  1159.    % It is important to do the page break before ending the group,
  1160.    % because the headline and footline are only empty inside the group.
  1161.    % If we use the new definition of page, we always get a blank page
  1162.    % after the title page, which we certainly don't want.
  1163.    oldpage
  1164.    endgroup
  1165.    %
  1166.    % If they want short, they certainly want long too.
  1167.    ifsetshortcontentsaftertitlepage
  1168.      shortcontents
  1169.      contents
  1170.      globalletshortcontents = relax
  1171.      globalletcontents = relax
  1172.    fi
  1173.    %
  1174.    ifsetcontentsaftertitlepage
  1175.      contents
  1176.      globalletcontents = relax
  1177.      globalletshortcontents = relax
  1178.    fi
  1179.    %
  1180.    HEADINGSon
  1181. }
  1182. deffinishtitlepage{%
  1183.    vskip4pt hrule height 2pt width hsize
  1184.    vskiptitlepagebottomglue
  1185.    finishedtitlepagetrue
  1186. }
  1187. %%% Set up page headings and footings.
  1188. letthispage=folio
  1189. newtoksevenheadline    % headline on even pages
  1190. newtoksoddheadline     % headline on odd pages
  1191. newtoksevenfootline    % footline on even pages
  1192. newtoksoddfootline     % footline on odd pages
  1193. % Now make Tex use those variables
  1194. headline={{textfontsrm ifoddpageno theoddheadline
  1195.                             else theevenheadline fi}}
  1196. footline={{textfontsrm ifoddpageno theoddfootline
  1197.                             else theevenfootline fi}HEADINGShook}
  1198. letHEADINGShook=relax
  1199. % Commands to set those variables.
  1200. % For example, this is what  @headings on  does
  1201. % @evenheading @thistitle|@thispage|@thischapter
  1202. % @oddheading @thischapter|@thispage|@thistitle
  1203. % @evenfooting @thisfile||
  1204. % @oddfooting ||@thisfile
  1205. defevenheading{parseargevenheadingxxx}
  1206. defoddheading{parseargoddheadingxxx}
  1207. defeveryheading{parseargeveryheadingxxx}
  1208. defevenfooting{parseargevenfootingxxx}
  1209. defoddfooting{parseargoddfootingxxx}
  1210. defeveryfooting{parseargeveryfootingxxx}
  1211. {catcode`@=0 %
  1212. gdefevenheadingxxx #1{evenheadingyyy #1@|@|@|@|finish}
  1213. gdefevenheadingyyy #1@|#2@|#3@|#4finish{%
  1214. globalevenheadline={rlap{centerline{#2}}line{#1hfil#3}}}
  1215. gdefoddheadingxxx #1{oddheadingyyy #1@|@|@|@|finish}
  1216. gdefoddheadingyyy #1@|#2@|#3@|#4finish{%
  1217. globaloddheadline={rlap{centerline{#2}}line{#1hfil#3}}}
  1218. gdefeveryheadingxxx#1{oddheadingxxx{#1}evenheadingxxx{#1}}%
  1219. gdefevenfootingxxx #1{evenfootingyyy #1@|@|@|@|finish}
  1220. gdefevenfootingyyy #1@|#2@|#3@|#4finish{%
  1221. globalevenfootline={rlap{centerline{#2}}line{#1hfil#3}}}
  1222. gdefoddfootingxxx #1{oddfootingyyy #1@|@|@|@|finish}
  1223. gdefoddfootingyyy #1@|#2@|#3@|#4finish{%
  1224.   globaloddfootline = {rlap{centerline{#2}}line{#1hfil#3}}%
  1225.   %
  1226.   % Leave some space for the footline.  Hopefully ok to assume
  1227.   % @evenfooting will not be used by itself.
  1228.   globaladvancepageheight by -baselineskip
  1229.   globaladvancevsize by -baselineskip
  1230. }
  1231. gdefeveryfootingxxx#1{oddfootingxxx{#1}evenfootingxxx{#1}}
  1232. %
  1233. }% unbind the catcode of @.
  1234. % @headings double      turns headings on for double-sided printing.
  1235. % @headings single      turns headings on for single-sided printing.
  1236. % @headings off         turns them off.
  1237. % @headings on          same as @headings double, retained for compatibility.
  1238. % @headings after       turns on double-sided headings after this page.
  1239. % @headings doubleafter turns on double-sided headings after this page.
  1240. % @headings singleafter turns on single-sided headings after this page.
  1241. % By default, they are off at the start of a document,
  1242. % and turned `on' after @end titlepage.
  1243. defheadings #1 {csname HEADINGS#1endcsname}
  1244. defHEADINGSoff{
  1245. globalevenheadline={hfil} globalevenfootline={hfil}
  1246. globaloddheadline={hfil} globaloddfootline={hfil}}
  1247. HEADINGSoff
  1248. % When we turn headings on, set the page number to 1.
  1249. % For double-sided printing, put current file name in lower left corner,
  1250. % chapter name on inside top of right hand pages, document
  1251. % title on inside top of left hand pages, and page numbers on outside top
  1252. % edge of all pages.
  1253. defHEADINGSdouble{
  1254. globalpageno=1
  1255. globalevenfootline={hfil}
  1256. globaloddfootline={hfil}
  1257. globalevenheadline={line{foliohfilthistitle}}
  1258. globaloddheadline={line{thischapterhfilfolio}}
  1259. globalletcontentsalignmacro = chapoddpage
  1260. }
  1261. letcontentsalignmacro = chappager
  1262. % For single-sided printing, chapter title goes across top left of page,
  1263. % page number on top right.
  1264. defHEADINGSsingle{
  1265. globalpageno=1
  1266. globalevenfootline={hfil}
  1267. globaloddfootline={hfil}
  1268. globalevenheadline={line{thischapterhfilfolio}}
  1269. globaloddheadline={line{thischapterhfilfolio}}
  1270. globalletcontentsalignmacro = chappager
  1271. }
  1272. defHEADINGSon{HEADINGSdouble}
  1273. defHEADINGSafter{letHEADINGShook=HEADINGSdoublex}
  1274. letHEADINGSdoubleafter=HEADINGSafter
  1275. defHEADINGSdoublex{%
  1276. globalevenfootline={hfil}
  1277. globaloddfootline={hfil}
  1278. globalevenheadline={line{foliohfilthistitle}}
  1279. globaloddheadline={line{thischapterhfilfolio}}
  1280. globalletcontentsalignmacro = chapoddpage
  1281. }
  1282. defHEADINGSsingleafter{letHEADINGShook=HEADINGSsinglex}
  1283. defHEADINGSsinglex{%
  1284. globalevenfootline={hfil}
  1285. globaloddfootline={hfil}
  1286. globalevenheadline={line{thischapterhfilfolio}}
  1287. globaloddheadline={line{thischapterhfilfolio}}
  1288. globalletcontentsalignmacro = chappager
  1289. }
  1290. % Subroutines used in generating headings
  1291. % Produces Day Month Year style of output.
  1292. deftoday{%
  1293.   numberdayspace
  1294.   ifcasemonth
  1295.   orputwordMJanorputwordMFeborputwordMMarorputwordMApr
  1296.   orputwordMMayorputwordMJunorputwordMJulorputwordMAug
  1297.   orputwordMSeporputwordMOctorputwordMNovorputwordMDec
  1298.   fi
  1299.   spacenumberyear}
  1300. % @settitle line...  specifies the title of the document, for headings.
  1301. % It generates no output of its own.
  1302. defthistitle{putwordNoTitle}
  1303. defsettitle{parseargsettitlezzz}
  1304. defsettitlezzz #1{gdefthistitle{#1}}
  1305. message{tables,}
  1306. % Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
  1307. % default indentation of table text
  1308. newdimentableindent tableindent=.8in
  1309. % default indentation of @itemize and @enumerate text
  1310. newdimenitemindent  itemindent=.3in
  1311. % margin between end of table item and start of table text.
  1312. newdimenitemmargin  itemmargin=.1in
  1313. % used internally for itemindent minus itemmargin
  1314. newdimenitemmax
  1315. % Note @table, @vtable, and @vtable define @item, @itemx, etc., with
  1316. % these defs.
  1317. % They also define itemindex
  1318. % to index the item name in whatever manner is desired (perhaps none).
  1319. newififitemxneedsnegativevskip
  1320. defitemxpar{parifitemxneedsnegativevskipnobreakvskip-parskipnobreakfi}
  1321. definternalBitem{smallbreak parseargitemzzz}
  1322. definternalBitemx{itemxpar parseargitemzzz}
  1323. definternalBxitem "#1"{defxitemsubtopix{#1} smallbreak parseargxitemzzz}
  1324. definternalBxitemx "#1"{defxitemsubtopix{#1} itemxpar parseargxitemzzz}
  1325. definternalBkitem{smallbreak parseargkitemzzz}
  1326. definternalBkitemx{itemxpar parseargkitemzzz}
  1327. defkitemzzz #1{dosubind {kw}{code{#1}}{for {bf lastfunction}}%
  1328.                  itemzzz {#1}}
  1329. defxitemzzz #1{dosubind {kw}{code{#1}}{for {bf xitemsubtopic}}%
  1330.                  itemzzz {#1}}
  1331. defitemzzz #1{begingroup %
  1332.   advancehsize by -rightskip
  1333.   advancehsize by -tableindent
  1334.   setbox0=hbox{itemfont{#1}}%
  1335.   itemindex{#1}%
  1336.   nobreak % This prevents a break before @itemx.
  1337.   %
  1338.   % If the item text does not fit in the space we have, put it on a line
  1339.   % by itself, and do not allow a page break either before or after that
  1340.   % line.  We do not start a paragraph here because then if the next
  1341.   % command is, e.g., @kindex, the whatsit would get put into the
  1342.   % horizontal list on a line by itself, resulting in extra blank space.
  1343.   ifdim wd0>itemmax
  1344.     %
  1345.     % Make this a paragraph so we get the parskip glue and wrapping,
  1346.     % but leave it ragged-right.
  1347.     begingroup
  1348.       advanceleftskip by-tableindent
  1349.       advancehsize bytableindent
  1350.       advancerightskip by0pt plus1fil
  1351.       leavevmodeunhbox0par
  1352.     endgroup
  1353.     %
  1354.     % We're going to be starting a paragraph, but we don't want the
  1355.     % parskip glue -- logically it's part of the @item we just started.
  1356.     nobreak vskip-parskip
  1357.     %
  1358.     % Stop a page break at the parskip glue coming up.  Unfortunately
  1359.     % we can't prevent a possible page break at the following
  1360.     % baselineskip glue.
  1361.     nobreak
  1362.     endgroup
  1363.     itemxneedsnegativevskipfalse
  1364.   else
  1365.     % The item text fits into the space.  Start a paragraph, so that the
  1366.     % following text (if any) will end up on the same line.
  1367.     noindent
  1368.     % Do this with kerns and unhbox so that if there is a footnote in
  1369.     % the item text, it can migrate to the main vertical list and
  1370.     % eventually be printed.
  1371.     nobreakkern-tableindent
  1372.     dimen0 = itemmax  advancedimen0 by itemmargin advancedimen0 by -wd0
  1373.     unhbox0
  1374.     nobreakkerndimen0
  1375.     endgroup
  1376.     itemxneedsnegativevskiptrue
  1377.   fi
  1378. }
  1379. defitem{errmessage{@item while not in a table}}
  1380. defitemx{errmessage{@itemx while not in a table}}
  1381. defkitem{errmessage{@kitem while not in a table}}
  1382. defkitemx{errmessage{@kitemx while not in a table}}
  1383. defxitem{errmessage{@xitem while not in a table}}
  1384. defxitemx{errmessage{@xitemx while not in a table}}
  1385. % Contains a kludge to get @end[description] to work.
  1386. defdescription{tablez{dontindex}{1}{}{}{}{}}
  1387. % @table, @ftable, @vtable.
  1388. deftable{begingroupinENVobeylinesobeyspacestablex}
  1389. {obeylinesobeyspaces%
  1390. gdeftablex #1^^M{%
  1391. tableydontindex#1        endtabley}}
  1392. defftable{begingroupinENVobeylinesobeyspacesftablex}
  1393. {obeylinesobeyspaces%
  1394. gdefftablex #1^^M{%
  1395. tableyfnitemindex#1        endtabley
  1396. defEftable{endgrafafterenvbreakendgroup}%
  1397. letEtable=relax}}
  1398. defvtable{begingroupinENVobeylinesobeyspacesvtablex}
  1399. {obeylinesobeyspaces%
  1400. gdefvtablex #1^^M{%
  1401. tableyvritemindex#1        endtabley
  1402. defEvtable{endgrafafterenvbreakendgroup}%
  1403. letEtable=relax}}
  1404. defdontindex #1{}
  1405. deffnitemindex #1{doind {fn}{code{#1}}}%
  1406. defvritemindex #1{doind {vr}{code{#1}}}%
  1407. {obeyspaces %
  1408. gdeftabley#1#2 #3 #4 #5 #6 #7endtabley{endgroup%
  1409. tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
  1410. deftablez #1#2#3#4#5#6{%
  1411. aboveenvbreak %
  1412. begingroup %
  1413. defEdescription{Etable}% Necessary kludge.
  1414. letitemindex=#1%
  1415. ifnum 0#3>0 advance leftskip by #3mil fi %
  1416. ifnum 0#4>0 tableindent=#4mil fi %
  1417. ifnum 0#5>0 advance rightskip by #5mil fi %
  1418. defitemfont{#2}%
  1419. itemmax=tableindent %
  1420. advance itemmax by -itemmargin %
  1421. advance leftskip by tableindent %
  1422. exdentamount=tableindent
  1423. parindent = 0pt
  1424. parskip = smallskipamount
  1425. ifdim parskip=0pt parskip=2pt fi%
  1426. defEtable{endgrafafterenvbreakendgroup}%
  1427. letitem = internalBitem %
  1428. letitemx = internalBitemx %
  1429. letkitem = internalBkitem %
  1430. letkitemx = internalBkitemx %
  1431. letxitem = internalBxitem %
  1432. letxitemx = internalBxitemx %
  1433. }
  1434. % This is the counter used by @enumerate, which is really @itemize
  1435. newcount itemno
  1436. defitemize{parseargitemizezzz}
  1437. defitemizezzz #1{%
  1438.   begingroup % ended by the @end itemize
  1439.   itemizey {#1}{Eitemize}
  1440. }
  1441. defitemizey #1#2{%
  1442. aboveenvbreak %
  1443. itemmax=itemindent %
  1444. advance itemmax by -itemmargin %
  1445. advance leftskip by itemindent %
  1446. exdentamount=itemindent
  1447. parindent = 0pt %
  1448. parskip = smallskipamount %
  1449. ifdim parskip=0pt parskip=2pt fi%
  1450. def#2{endgrafafterenvbreakendgroup}%
  1451. defitemcontents{#1}%
  1452. letitem=itemizeitem}
  1453. % Set sfcode to normal for the chars that usually have another value.
  1454. % These are `.?!:;,'
  1455. deffrenchspacing{sfcode46=1000 sfcode63=1000 sfcode33=1000
  1456.   sfcode58=1000 sfcode59=1000 sfcode44=1000 }
  1457. % splitoff TOKENSendmark defines first to be the first token in
  1458. % TOKENS, and rest to be the remainder.
  1459. %
  1460. defsplitoff#1#2endmark{deffirst{#1}defrest{#2}}%
  1461. % Allow an optional argument of an uppercase letter, lowercase letter,
  1462. % or number, to specify the first label in the enumerated list.  No
  1463. % argument is the same as `1'.
  1464. %
  1465. defenumerate{parseargenumeratezzz}
  1466. defenumeratezzz #1{enumeratey #1  endenumeratey}
  1467. defenumeratey #1 #2endenumeratey{%
  1468.   begingroup % ended by the @end enumerate
  1469.   %
  1470.   % If we were given no argument, pretend we were given `1'.
  1471.   defthearg{#1}%
  1472.   ifxtheargempty defthearg{1}fi
  1473.   %
  1474.   % Detect if the argument is a single token.  If so, it might be a
  1475.   % letter.  Otherwise, the only valid thing it can be is a number.
  1476.   % (We will always have one token, because of the test we just made.
  1477.   % This is a good thing, since splitoff doesn't work given nothing at
  1478.   % all -- the first parameter is undelimited.)
  1479.   expandaftersplitofftheargendmark
  1480.   ifxrestempty
  1481.     % Only one token in the argument.  It could still be anything.
  1482.     % A ``lowercase letter'' is one whose lccode is nonzero.
  1483.     % An ``uppercase letter'' is one whose lccode is both nonzero, and
  1484.     %   not equal to itself.
  1485.     % Otherwise, we assume it's a number.
  1486.     %
  1487.     % We need the relax at the end of the ifnum lines to stop TeX from
  1488.     % continuing to look for a <number>.
  1489.     %
  1490.     ifnumlccodeexpandafter`thearg=0relax
  1491.       numericenumerate % a number (we hope)
  1492.     else
  1493.       % It's a letter.
  1494.       ifnumlccodeexpandafter`thearg=expandafter`theargrelax
  1495.         lowercaseenumerate % lowercase letter
  1496.       else
  1497.         uppercaseenumerate % uppercase letter
  1498.       fi
  1499.     fi
  1500.   else
  1501.     % Multiple tokens in the argument.  We hope it's a number.
  1502.     numericenumerate
  1503.   fi
  1504. }
  1505. % An @enumerate whose labels are integers.  The starting integer is
  1506. % given in thearg.
  1507. %
  1508. defnumericenumerate{%
  1509.   itemno = thearg
  1510.   startenumeration{theitemno}%
  1511. }
  1512. % The starting (lowercase) letter is in thearg.
  1513. deflowercaseenumerate{%
  1514.   itemno = expandafter`thearg
  1515.   startenumeration{%
  1516.     % Be sure we're not beyond the end of the alphabet.
  1517.     ifnumitemno=0
  1518.       errmessage{No more lowercase letters in @enumerate; get a bigger
  1519.                   alphabet}%
  1520.     fi
  1521.     charlccodeitemno
  1522.   }%
  1523. }
  1524. % The starting (uppercase) letter is in thearg.
  1525. defuppercaseenumerate{%
  1526.   itemno = expandafter`thearg
  1527.   startenumeration{%
  1528.     % Be sure we're not beyond the end of the alphabet.
  1529.     ifnumitemno=0
  1530.       errmessage{No more uppercase letters in @enumerate; get a bigger
  1531.                   alphabet}
  1532.     fi
  1533.     charuccodeitemno
  1534.   }%
  1535. }
  1536. % Call itemizey, adding a period to the first argument and supplying the
  1537. % common last two arguments.  Also subtract one from the initial value in
  1538. % itemno, since @item increments itemno.
  1539. %
  1540. defstartenumeration#1{%
  1541.   advanceitemno by -1
  1542.   itemizey{#1.}Eenumerateflushcr
  1543. }
  1544. % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
  1545. % to @enumerate.
  1546. %
  1547. defalphaenumerate{enumerate{a}}
  1548. defcapsenumerate{enumerate{A}}
  1549. defEalphaenumerate{Eenumerate}
  1550. defEcapsenumerate{Eenumerate}
  1551. % Definition of @item while inside @itemize.
  1552. defitemizeitem{%
  1553. advanceitemno by 1
  1554. {letpar=endgraf smallbreak}%
  1555. ifhmode errmessage{In hmode at itemizeitem}fi
  1556. {parskip=0in hskip 0pt
  1557. hbox to 0pt{hss itemcontentshskip itemmargin}%
  1558. vadjust{penalty 1200}}%
  1559. flushcr}
  1560. % @multitable macros
  1561. % Amy Hendrickson, 8/18/94, 3/6/96
  1562. %
  1563. % @multitable ... @end multitable will make as many columns as desired.
  1564. % Contents of each column will wrap at width given in preamble.  Width
  1565. % can be specified either with sample text given in a template line,
  1566. % or in percent of hsize, the current width of text on page.
  1567. % Table can continue over pages but will only break between lines.
  1568. % To make preamble:
  1569. %
  1570. % Either define widths of columns in terms of percent of hsize:
  1571. %   @multitable @columnfractions .25 .3 .45
  1572. %   @item ...
  1573. %
  1574. %   Numbers following @columnfractions are the percent of the total
  1575. %   current hsize to be used for each column. You may use as many
  1576. %   columns as desired.
  1577. % Or use a template:
  1578. %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
  1579. %   @item ...
  1580. %   using the widest term desired in each column.
  1581. %
  1582. % For those who want to use more than one line's worth of words in
  1583. % the preamble, break the line within one argument and it
  1584. % will parse correctly, i.e.,
  1585. %
  1586. %     @multitable {Column 1 template} {Column 2 template} {Column 3
  1587. %      template}
  1588. % Not:
  1589. %     @multitable {Column 1 template} {Column 2 template}
  1590. %      {Column 3 template}
  1591. % Each new table line starts with @item, each subsequent new column
  1592. % starts with @tab. Empty columns may be produced by supplying @tab's
  1593. % with nothing between them for as many times as empty columns are needed,
  1594. % ie, @tab@tab@tab will produce two empty columns.
  1595. % @item, @tab, @multitable or @end multitable do not need to be on their
  1596. % own lines, but it will not hurt if they are.
  1597. % Sample multitable:
  1598. %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
  1599. %   @item first col stuff @tab second col stuff @tab third col
  1600. %   @item
  1601. %   first col stuff
  1602. %   @tab
  1603. %   second col stuff
  1604. %   @tab
  1605. %   third col
  1606. %   @item first col stuff @tab second col stuff
  1607. %   @tab Many paragraphs of text may be used in any column.
  1608. %
  1609. %         They will wrap at the width determined by the template.
  1610. %   @item@tab@tab This will be in third column.
  1611. %   @end multitable
  1612. % Default dimensions may be reset by user.
  1613. % @multitableparskip is vertical space between paragraphs in table.
  1614. % @multitableparindent is paragraph indent in table.
  1615. % @multitablecolmargin is horizontal space to be left between columns.
  1616. % @multitablelinespace is space to leave between table items, baseline
  1617. %                                                            to baseline.
  1618. %   0pt means it depends on current normal line spacing.
  1619. %
  1620. newskipmultitableparskip
  1621. newskipmultitableparindent
  1622. newdimenmultitablecolspace
  1623. newskipmultitablelinespace
  1624. multitableparskip=0pt
  1625. multitableparindent=6pt
  1626. multitablecolspace=12pt
  1627. multitablelinespace=0pt
  1628. % Macros used to set up halign preamble:
  1629. %
  1630. letendsetuptablerelax
  1631. defxendsetuptable{endsetuptable}
  1632. letcolumnfractionsrelax
  1633. defxcolumnfractions{columnfractions}
  1634. newififsetpercent
  1635. % #1 is the part of the @columnfraction before the decimal point, which
  1636. % is presumably either 0 or the empty string (but we don't check, we
  1637. % just throw it away).  #2 is the decimal part, which we use as the
  1638. % percent of hsize for this column.
  1639. defpickupwholefraction#1.#2 {%
  1640.   globaladvancecolcount by 1
  1641.   expandafterxdefcsname colthecolcountendcsname{.#2hsize}%
  1642.   setuptable
  1643. }
  1644. newcountcolcount
  1645. defsetuptable#1{%
  1646.   deffirstarg{#1}%
  1647.   ifxfirstargxendsetuptable
  1648.     letgo = relax
  1649.   else
  1650.     ifxfirstargxcolumnfractions
  1651.       globalsetpercenttrue
  1652.     else
  1653.       ifsetpercent
  1654.          letgopickupwholefraction
  1655.       else
  1656.          globaladvancecolcount by 1
  1657.          setbox0=hbox{#1unskip }% Add a normal word space as a separator;
  1658.                             % typically that is always in the input, anyway.
  1659.          expandafterxdefcsname colthecolcountendcsname{thewd0}%
  1660.       fi
  1661.     fi
  1662.     ifxgopickupwholefraction
  1663.       % Put the argument back for the pickupwholefraction call, so
  1664.       % we'll always have a period there to be parsed.
  1665.       defgo{pickupwholefraction#1}%
  1666.     else
  1667.       letgo = setuptable
  1668.     fi%
  1669.   fi
  1670.   go
  1671. }
  1672. % multitable syntax
  1673. deftab{&hskip1sprelax} % 2/2/96
  1674.                            % tiny skip here makes sure this column space is
  1675.                            % maintained, even if it is never used.
  1676. % @multitable ... @end multitable definitions:
  1677. %
  1678. defmultitable{parseargdotable}
  1679. defdotable#1{bgroup
  1680.   vskipparskip
  1681.   letitemcrcr
  1682.   tolerance=9500
  1683.   hbadness=9500
  1684.   setmultitablespacing
  1685.   parskip=multitableparskip
  1686.   parindent=multitableparindent
  1687.   overfullrule=0pt
  1688.   globalcolcount=0
  1689.   defEmultitable{globalsetpercentfalsecregroupegroup}%
  1690.   %
  1691.   % To parse everything between @multitable and @item:
  1692.   setuptable#1 endsetuptable
  1693.   %
  1694.   % everycr will reset column counter, colcount, at the end of
  1695.   % each line. Every column entry will cause colcount to advance by one.
  1696.   % The table preamble
  1697.   % looks at the current colcount to find the correct column width.
  1698.   everycr{noalign{%
  1699.   %
  1700.   % filbreak%% keeps underfull box messages off when table breaks over pages.
  1701.   % Maybe so, but it also creates really weird page breaks when the table
  1702.   % breaks over pages. Wouldn't vfil be better?  Wait until the problem
  1703.   % manifests itself, so it can be fixed for real --karl.
  1704.     globalcolcount=0relax}}%
  1705.   %
  1706.   % This preamble sets up a generic column definition, which will
  1707.   % be used as many times as user calls for columns.
  1708.   % vtop will set a single line and will also let text wrap and
  1709.   % continue for many paragraphs if desired.
  1710.   halignbgroup&globaladvancecolcount by 1relax
  1711.     multistrutvtop{hsize=expandaftercsname colthecolcountendcsname
  1712.   %
  1713.   % In order to keep entries from bumping into each other
  1714.   % we will add a leftskip of multitablecolspace to all columns after
  1715.   % the first one.
  1716.   %
  1717.   % If a template has been used, we will add multitablecolspace
  1718.   % to the width of each template entry.
  1719.   %
  1720.   % If the user has set preamble in terms of percent of hsize we will
  1721.   % use that dimension as the width of the column, and the leftskip
  1722.   % will keep entries from bumping into each other.  Table will start at
  1723.   % left margin and final column will justify at right margin.
  1724.   %
  1725.   % Make sure we don't inherit rightskip from the outer environment.
  1726.   rightskip=0pt
  1727.   ifnumcolcount=1
  1728.     % The first column will be indented with the surrounding text.
  1729.     advancehsize byleftskip
  1730.   else
  1731.     ifsetpercent else
  1732.       % If user has not set preamble in terms of percent of hsize
  1733.       % we will advance hsize by multitablecolspace.
  1734.       advancehsize by multitablecolspace
  1735.     fi
  1736.    % In either case we will make leftskip=multitablecolspace:
  1737.   leftskip=multitablecolspace
  1738.   fi
  1739.   % Ignoring space at the beginning and end avoids an occasional spurious
  1740.   % blank line, when TeX decides to break the line at the space before the
  1741.   % box from the multistrut, so the strut ends up on a line by itself.
  1742.   % For example:
  1743.   % @multitable @columnfractions .11 .89
  1744.   % @item @code{#}
  1745.   % @tab Legal holiday which is valid in major parts of the whole country.
  1746.   % Is automatically provided with highlighting sequences respectively marking
  1747.   % characters.
  1748.   noindentignorespaces##unskipmultistrut}cr
  1749. }
  1750. defsetmultitablespacing{% test to see if user has set multitablelinespace.
  1751. % If so, do nothing. If not, give it an appropriate dimension based on
  1752. % current baselineskip.
  1753. ifdimmultitablelinespace=0pt
  1754. %% strut to put in table in case some entry doesn't have descenders,
  1755. %% to keep lines equally spaced
  1756. letmultistrut = strut
  1757. %% Test to see if parskip is larger than space between lines of
  1758. %% table. If not, do nothing.
  1759. %%        If so, set to same dimension as multitablelinespace.
  1760. else
  1761. gdefmultistrut{vrule heightmultitablelinespace depthdp0
  1762. width0ptrelax} fi
  1763. ifdimmultitableparskip>multitablelinespace
  1764. globalmultitableparskip=multitablelinespace
  1765. globaladvancemultitableparskip-7pt %% to keep parskip somewhat smaller
  1766.                                       %% than skip between lines in the table.
  1767. fi%
  1768. ifdimmultitableparskip=0pt
  1769. globalmultitableparskip=multitablelinespace
  1770. globaladvancemultitableparskip-7pt %% to keep parskip somewhat smaller
  1771.                                       %% than skip between lines in the table.
  1772. fi}
  1773. message{conditionals,}
  1774. % Prevent errors for section commands.
  1775. % Used in @ignore and in failing conditionals.
  1776. defignoresections{%
  1777.   letchapter=relax
  1778.   letunnumbered=relax
  1779.   lettop=relax
  1780.   letunnumberedsec=relax
  1781.   letunnumberedsection=relax
  1782.   letunnumberedsubsec=relax
  1783.   letunnumberedsubsection=relax
  1784.   letunnumberedsubsubsec=relax
  1785.   letunnumberedsubsubsection=relax
  1786.   letsection=relax
  1787.   letsubsec=relax
  1788.   letsubsubsec=relax
  1789.   letsubsection=relax
  1790.   letsubsubsection=relax
  1791.   letappendix=relax
  1792.   letappendixsec=relax
  1793.   letappendixsection=relax
  1794.   letappendixsubsec=relax
  1795.   letappendixsubsection=relax
  1796.   letappendixsubsubsec=relax
  1797.   letappendixsubsubsection=relax
  1798.   letcontents=relax
  1799.   letsmallbook=relax
  1800.   lettitlepage=relax
  1801. }
  1802. % Used in nested conditionals, where we have to parse the Texinfo source
  1803. % and so want to turn off most commands, in case they are used
  1804. % incorrectly.
  1805. %
  1806. defignoremorecommands{%
  1807.   letdefcodeindex = relax
  1808.   letdefcv = relax
  1809.   letdeffn = relax
  1810.   letdeffnx = relax
  1811.   letdefindex = relax
  1812.   letdefivar = relax
  1813.   letdefmac = relax
  1814.   letdefmethod = relax
  1815.   letdefop = relax
  1816.   letdefopt = relax
  1817.   letdefspec = relax
  1818.   letdeftp = relax
  1819.   letdeftypefn = relax
  1820.   letdeftypefun = relax
  1821.   letdeftypevar = relax
  1822.   letdeftypevr = relax
  1823.   letdefun = relax
  1824.   letdefvar = relax
  1825.   letdefvr = relax
  1826.   letref = relax
  1827.   letxref = relax
  1828.   letprintindex = relax
  1829.   letpxref = relax
  1830.   letsettitle = relax
  1831.   letsetchapternewpage = relax
  1832.   letsetchapterstyle = relax
  1833.   leteveryheading = relax
  1834.   letevenheading = relax
  1835.   letoddheading = relax
  1836.   leteveryfooting = relax
  1837.   letevenfooting = relax
  1838.   letoddfooting = relax
  1839.   letheadings = relax
  1840.   letinclude = relax
  1841.   letlowersections = relax
  1842.   letdown = relax
  1843.   letraisesections = relax
  1844.   letup = relax
  1845.   letset = relax
  1846.   letclear = relax
  1847.   letitem = relax
  1848. }
  1849. % Ignore @ignore ... @end ignore.
  1850. %
  1851. defignore{doignore{ignore}}
  1852. % Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text.
  1853. %
  1854. defifinfo{doignore{ifinfo}}
  1855. defifhtml{doignore{ifhtml}}
  1856. defifnottex{doignore{ifnottex}}
  1857. defhtml{doignore{html}}
  1858. defmenu{doignore{menu}}
  1859. defdirentry{doignore{direntry}}
  1860. % @dircategory CATEGORY  -- specify a category of the dir file
  1861. % which this file should belong to.  Ignore this in TeX.
  1862. letdircategory = comment
  1863. % Ignore text until a line `@end #1'.
  1864. %
  1865. defdoignore#1{begingroup
  1866.   % Don't complain about control sequences we have declared outer.
  1867.   ignoresections
  1868.   %
  1869.   % Define a command to swallow text until we reach `@end #1'.
  1870.   % This @ is a catcode 12 token (that is the normal catcode of @ in
  1871.   % this texinfo.tex file).  We change the catcode of @ below to match.
  1872.   longdefdoignoretext##1@end #1{enddoignore}%
  1873.   %
  1874.   % Make sure that spaces turn into tokens that match what doignoretext wants.
  1875.   catcode32 = 10
  1876.   %
  1877.   % Ignore braces, too, so mismatched braces don't cause trouble.
  1878.   catcode`{ = 9
  1879.   catcode`} = 9
  1880.   %
  1881.   % We must not have @c interpreted as a control sequence.
  1882.   catcode`@ = 12
  1883.   %
  1884.   % Make the letter c a comment character so that the rest of the line
  1885.   % will be ignored. This way, the document can have (for example)
  1886.   %   @c @end ifinfo
  1887.   % and the @end ifinfo will be properly ignored.
  1888.   % (We've just changed @ to catcode 12.)
  1889.   catcode`c = 14
  1890.   %
  1891.   % And now expand that command.
  1892.   doignoretext
  1893. }
  1894. % What we do to finish off ignored text.
  1895. %
  1896. defenddoignore{endgroupignorespaces}%
  1897. newififwarnedobswarnedobsfalse
  1898. defobstexwarn{%
  1899.   ifwarnedobsrelaxelse
  1900.   % We need to warn folks that they may have trouble with TeX 3.0.
  1901.   % This uses immediatewrite16 rather than message to get newlines.
  1902.     immediatewrite16{}
  1903.     immediatewrite16{WARNING: for users of Unix TeX 3.0!}
  1904.     immediatewrite16{This manual trips a bug in TeX version 3.0 (tex hangs).}
  1905.     immediatewrite16{If you are running another version of TeX, relax.}
  1906.     immediatewrite16{If you are running Unix TeX 3.0, kill this TeX process.}
  1907.     immediatewrite16{  Then upgrade your TeX installation if you can.}
  1908.     immediatewrite16{  (See ftp://ftp.gnu.org/pub/gnu/TeX.README.)}
  1909.     immediatewrite16{If you are stuck with version 3.0, run the}
  1910.     immediatewrite16{  script ``tex3patch'' from the Texinfo distribution}
  1911.     immediatewrite16{  to use a workaround.}
  1912.     immediatewrite16{}
  1913.     globalwarnedobstrue
  1914.     fi
  1915. }
  1916. % **In TeX 3.0, setting text in nullfont hangs tex.  For a
  1917. % workaround (which requires the file ``dummy.tfm'' to be installed),
  1918. % uncomment the following line:
  1919. %%%%%fontnullfont=dummyletobstexwarn=relax
  1920. % Ignore text, except that we keep track of conditional commands for
  1921. % purposes of nesting, up to an `@end #1' command.
  1922. %
  1923. defnestedignore#1{%
  1924.   obstexwarn
  1925.   % We must actually expand the ignored text to look for the @end
  1926.   % command, so that nested ignore constructs work.  Thus, we put the
  1927.   % text into a vbox and then do nothing with the result.  To minimize
  1928.   % the change of memory overflow, we follow the approach outlined on
  1929.   % page 401 of the TeXbook: make the current font be a dummy font.
  1930.   %
  1931.   setbox0 = vboxbgroup
  1932.     % Don't complain about control sequences we have declared outer.
  1933.     ignoresections
  1934.     %
  1935.     % Define `@end #1' to end the box, which will in turn undefine the
  1936.     % @end command again.
  1937.     expandafterdefcsname E#1endcsname{egroupignorespaces}%
  1938.     %
  1939.     % We are going to be parsing Texinfo commands.  Most cause no
  1940.     % trouble when they are used incorrectly, but some commands do
  1941.     % complicated argument parsing or otherwise get confused, so we
  1942.     % undefine them.
  1943.     %
  1944.     % We can't do anything about stray @-signs, unfortunately;
  1945.     % they'll produce `undefined control sequence' errors.
  1946.     ignoremorecommands
  1947.     %
  1948.     % Set the current font to be nullfont, a TeX primitive, and define
  1949.     % all the font commands to also use nullfont.  We don't use
  1950.     % dummy.tfm, as suggested in the TeXbook, because not all sites
  1951.     % might have that installed.  Therefore, math mode will still
  1952.     % produce output, but that should be an extremely small amount of
  1953.     % stuff compared to the main input.
  1954.     %
  1955.     nullfont
  1956.     lettenrm = nullfont  lettenit = nullfont  lettensl = nullfont
  1957.     lettenbf = nullfont  lettentt = nullfont  letsmallcaps = nullfont
  1958.     lettensf = nullfont
  1959.     % Similarly for index fonts (mostly for their use in
  1960.     % smallexample)
  1961.     letindrm = nullfont  letindit = nullfont  letindsl = nullfont
  1962.     letindbf = nullfont  letindtt = nullfont  letindsc = nullfont
  1963.     letindsf = nullfont
  1964.     %
  1965.     % Don't complain when characters are missing from the fonts.
  1966.     tracinglostchars = 0
  1967.     %
  1968.     % Don't bother to do space factor calculations.
  1969.     frenchspacing
  1970.     %
  1971.     % Don't report underfull hboxes.
  1972.     hbadness = 10000
  1973.     %
  1974.     % Do minimal line-breaking.
  1975.     pretolerance = 10000
  1976.     %
  1977.     % Do not execute instructions in @tex
  1978.     deftex{doignore{tex}}%
  1979.     % Do not execute macro definitions.
  1980.     % `c' is a comment character, so the word `macro' will get cut off.
  1981.     defmacro{doignore{ma}}%
  1982. }
  1983. % @set VAR sets the variable VAR to an empty value.
  1984. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
  1985. %
  1986. % Since we want to separate VAR from REST-OF-LINE (which might be
  1987. % empty), we can't just use parsearg; we have to insert a space of our
  1988. % own to delimit the rest of the line, and then take it out again if we
  1989. % didn't need it.  Make sure the catcode of space is correct to avoid
  1990. % losing inside @example, for instance.
  1991. %
  1992. defset{begingroupcatcode` =10
  1993.   catcode`-=12 catcode`_=12 % Allow - and _ in VAR.
  1994.   parseargsetxxx}
  1995. defsetxxx#1{setyyy#1 endsetyyy}
  1996. defsetyyy#1 #2endsetyyy{%
  1997.   deftemp{#2}%
  1998.   ifxtempempty globalexpandafterletcsname SET#1endcsname = empty
  1999.   else setzzz{#1}#2endsetzzz % Remove the trailing space setxxx inserted.
  2000.   fi
  2001.   endgroup
  2002. }
  2003. % Can't use xdef to pre-expand #2 and save some time, since temp or
  2004. % next or other control sequences that we've defined might get us into
  2005. % an infinite loop. Consider `@set foo @cite{bar}'.
  2006. defsetzzz#1#2 endsetzzz{expandaftergdefcsname SET#1endcsname{#2}}
  2007. % @clear VAR clears (i.e., unsets) the variable VAR.
  2008. %
  2009. defclear{parseargclearxxx}
  2010. defclearxxx#1{globalexpandafterletcsname SET#1endcsname=relax}
  2011. % @value{foo} gets the text saved in variable foo.
  2012. {
  2013.   catcode`_ = active
  2014.   %
  2015.   % We might end up with active _ or - characters in the argument if
  2016.   % we're called from @code, as @code{@value{foo-bar_}}.  So let any
  2017.   % such active characters to their normal equivalents.
  2018.   gdefvalue{begingroup
  2019.     catcode`-=12 catcode`_=12
  2020.     indexbreaks let_normalunderscore
  2021.     valuexxx}
  2022. }
  2023. defvaluexxx#1{expandablevalue{#1}endgroup}
  2024. % We have this subroutine so that we can handle at least some @value's
  2025. % properly in indexes (we letvalue to this in indexdummies).  Ones
  2026. % whose names contain - or _ still won't work, but we can't do anything
  2027. % about that.  The command has to be fully expandable, since the result
  2028. % winds up in the index file.  This means that if the variable's value
  2029. % contains other Texinfo commands, it's almost certain it will fail
  2030. % (although perhaps we could fix that with sufficient work to do a
  2031. % one-level expansion on the result, instead of complete).
  2032. %
  2033. defexpandablevalue#1{%
  2034.   expandafterifxcsname SET#1endcsnamerelax
  2035.     {[No value for ``#1'']}%
  2036.   else
  2037.     csname SET#1endcsname
  2038.   fi
  2039. }
  2040. % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
  2041. % with @set.
  2042. %
  2043. defifset{parseargifsetxxx}
  2044. defifsetxxx #1{%
  2045.   expandafterifxcsname SET#1endcsnamerelax
  2046.     expandafterifsetfail
  2047.   else
  2048.     expandafterifsetsucceed
  2049.   fi
  2050. }
  2051. defifsetsucceed{conditionalsucceed{ifset}}
  2052. defifsetfail{nestedignore{ifset}}
  2053. defineunmatchedend{ifset}
  2054. % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
  2055. % defined with @set, or has been undefined with @clear.
  2056. %
  2057. defifclear{parseargifclearxxx}
  2058. defifclearxxx #1{%
  2059.   expandafterifxcsname SET#1endcsnamerelax
  2060.     expandafterifclearsucceed
  2061.   else
  2062.     expandafterifclearfail
  2063.   fi
  2064. }
  2065. defifclearsucceed{conditionalsucceed{ifclear}}
  2066. defifclearfail{nestedignore{ifclear}}
  2067. defineunmatchedend{ifclear}
  2068. % @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text
  2069. % following, through the first @end iftex (etc.).  Make `@end iftex'
  2070. % (etc.) valid only after an @iftex.
  2071. %
  2072. defiftex{conditionalsucceed{iftex}}
  2073. defifnothtml{conditionalsucceed{ifnothtml}}
  2074. defifnotinfo{conditionalsucceed{ifnotinfo}}
  2075. defineunmatchedend{iftex}
  2076. defineunmatchedend{ifnothtml}
  2077. defineunmatchedend{ifnotinfo}
  2078. % We can't just want to start a group at @iftex (for example) and end it
  2079. % at @end iftex, since then @set commands inside the conditional have no
  2080. % effect (they'd get reverted at the end of the group).  So we must
  2081. % define Eiftex to redefine itself to be its previous value.  (We can't
  2082. % just define it to fail again with an ``unmatched end'' error, since
  2083. % the @ifset might be nested.)
  2084. %
  2085. defconditionalsucceed#1{%
  2086.   edeftemp{%
  2087.     % Remember the current value of E#1.
  2088.     letnece{prevE#1} = nece{E#1}%
  2089.     %
  2090.     % At the `@end #1', redefine E#1 to be its previous value.
  2091.     defnece{E#1}{letnece{E#1} = nece{prevE#1}}%
  2092.   }%
  2093.   temp
  2094. }
  2095. % We need to expand lots of csname's, but we don't want to expand the
  2096. % control sequences after we've constructed them.
  2097. %
  2098. defnece#1{expandafternoexpandcsname#1endcsname}
  2099. % @defininfoenclose.
  2100. letdefinfoenclose=comment
  2101. message{indexing,}
  2102. % Index generation facilities
  2103. % Define newwrite to be identical to plain tex's newwrite
  2104. % except not outer, so it can be used within newindex.
  2105. {catcode`@=11
  2106. gdefnewwrite{alloc@7writechardefsixt@@n}}
  2107. % newindex {foo} defines an index named foo.
  2108. % It automatically defines fooindex such that
  2109. % fooindex ...rest of line... puts an entry in the index foo.
  2110. % It also defines fooindfile to be the number of the output channel for
  2111. % the file that accumulates this index.  The file's extension is foo.
  2112. % The name of an index should be no more than 2 characters long
  2113. % for the sake of vms.
  2114. %
  2115. defnewindex#1{%
  2116.   iflinks
  2117.     expandafternewwrite csname#1indfileendcsname
  2118.     openout csname#1indfileendcsname jobname.#1 % Open the file
  2119.   fi
  2120.   expandafterxdefcsname#1indexendcsname{%     % Define @#1index
  2121.     noexpanddoindex{#1}}
  2122. }
  2123. % @defindex foo  ==  newindex{foo}
  2124. defdefindex{parseargnewindex}
  2125. % Define @defcodeindex, like @defindex except put all entries in @code.
  2126. defnewcodeindex#1{%
  2127.   iflinks
  2128.     expandafternewwrite csname#1indfileendcsname
  2129.     openout csname#1indfileendcsname jobname.#1
  2130.   fi
  2131.   expandafterxdefcsname#1indexendcsname{%
  2132.     noexpanddocodeindex{#1}}
  2133. }
  2134. defdefcodeindex{parseargnewcodeindex}
  2135. % @synindex foo bar    makes index foo feed into index bar.
  2136. % Do this instead of @defindex foo if you don't want it as a separate index.
  2137. % The closeout helps reduce unnecessary open files; the limit on the
  2138. % Acorn RISC OS is a mere 16 files.
  2139. defsynindex#1 #2 {%
  2140.   expandafterletexpandaftersynindexfooexpandafter=csname#2indfileendcsname
  2141.   expandaftercloseoutcsname#1indfileendcsname
  2142.   expandafterletcsname#1indfileendcsname=synindexfoo
  2143.   expandafterxdefcsname#1indexendcsname{% define xxxindex
  2144.     noexpanddoindex{#2}}%
  2145. }
  2146. % @syncodeindex foo bar   similar, but put all entries made for index foo
  2147. % inside @code.
  2148. defsyncodeindex#1 #2 {%
  2149.   expandafterletexpandaftersynindexfooexpandafter=csname#2indfileendcsname
  2150.   expandaftercloseoutcsname#1indfileendcsname
  2151.   expandafterletcsname#1indfileendcsname=synindexfoo
  2152.   expandafterxdefcsname#1indexendcsname{% define xxxindex
  2153.     noexpanddocodeindex{#2}}%
  2154. }
  2155. % Define doindex, the driver for all fooindex macros.
  2156. % Argument #1 is generated by the calling fooindex macro,
  2157. %  and it is "foo", the name of the index.
  2158. % doindex just uses parsearg; it calls doind for the actual work.
  2159. % This is because doind is more useful to call from other macros.
  2160. % There is also dosubind {index}{topic}{subtopic}
  2161. % which makes an entry in a two-level index such as the operation index.
  2162. defdoindex#1{edefindexname{#1}parseargsingleindexer}
  2163. defsingleindexer #1{doind{indexname}{#1}}
  2164. % like the previous two, but they put @code around the argument.
  2165. defdocodeindex#1{edefindexname{#1}parseargsinglecodeindexer}
  2166. defsinglecodeindexer #1{doind{indexname}{code{#1}}}
  2167. defindexdummies{%
  2168. def { }%
  2169. % Take care of the plain tex accent commands.
  2170. def"{realbackslash "}%
  2171. def`{realbackslash `}%
  2172. def'{realbackslash '}%
  2173. def^{realbackslash ^}%
  2174. def~{realbackslash ~}%
  2175. def={realbackslash =}%
  2176. defb{realbackslash b}%
  2177. defc{realbackslash c}%
  2178. defd{realbackslash d}%
  2179. defu{realbackslash u}%
  2180. defv{realbackslash v}%
  2181. defH{realbackslash H}%
  2182. % Take care of the plain tex special European modified letters.
  2183. defoe{realbackslash oe}%
  2184. defae{realbackslash ae}%
  2185. defaa{realbackslash aa}%
  2186. defOE{realbackslash OE}%
  2187. defAE{realbackslash AE}%
  2188. defAA{realbackslash AA}%
  2189. defo{realbackslash o}%
  2190. defO{realbackslash O}%
  2191. defl{realbackslash l}%
  2192. defL{realbackslash L}%
  2193. defss{realbackslash ss}%
  2194. % Take care of texinfo commands likely to appear in an index entry.
  2195. % (Must be a way to avoid doing expansion at all, and thus not have to
  2196. % laboriously list every single command here.)
  2197. def@{@}% will be @@ when we switch to @ as escape char.
  2198. % Need these in case tex is in effect and { is a delimiter again.
  2199. % But can't use lbracecmd and rbracecmd because texindex assumes
  2200. % braces and backslashes are used only as delimiters.
  2201. let{ = mylbrace
  2202. let} = myrbrace
  2203. def_{{realbackslash _}}%
  2204. defw{realbackslash w }%
  2205. defbf{realbackslash bf }%
  2206. %defrm{realbackslash rm }%
  2207. defsl{realbackslash sl }%
  2208. defsf{realbackslash sf}%
  2209. deftt{realbackslash tt}%
  2210. defgtr{realbackslash gtr}%
  2211. defless{realbackslash less}%
  2212. defhat{realbackslash hat}%
  2213. defTeX{realbackslash TeX}%
  2214. defdots{realbackslash dots }%
  2215. defresult{realbackslash result}%
  2216. defequiv{realbackslash equiv}%
  2217. defexpansion{realbackslash expansion}%
  2218. defprint{realbackslash print}%
  2219. deferror{realbackslash error}%
  2220. defpoint{realbackslash point}%
  2221. defcopyright{realbackslash copyright}%
  2222. deftclose##1{realbackslash tclose {##1}}%
  2223. defcode##1{realbackslash code {##1}}%
  2224. defuref##1{realbackslash uref {##1}}%
  2225. defurl##1{realbackslash url {##1}}%
  2226. defenv##1{realbackslash env {##1}}%
  2227. defcommand##1{realbackslash command {##1}}%
  2228. defoption##1{realbackslash option {##1}}%
  2229. defdotless##1{realbackslash dotless {##1}}%
  2230. defsamp##1{realbackslash samp {##1}}%
  2231. def,##1{realbackslash ,{##1}}%
  2232. deft##1{realbackslash t {##1}}%
  2233. defr##1{realbackslash r {##1}}%
  2234. defi##1{realbackslash i {##1}}%
  2235. defb##1{realbackslash b {##1}}%
  2236. defsc##1{realbackslash sc {##1}}%
  2237. defcite##1{realbackslash cite {##1}}%
  2238. defkey##1{realbackslash key {##1}}%
  2239. deffile##1{realbackslash file {##1}}%
  2240. defvar##1{realbackslash var {##1}}%
  2241. defkbd##1{realbackslash kbd {##1}}%
  2242. defdfn##1{realbackslash dfn {##1}}%
  2243. defemph##1{realbackslash emph {##1}}%
  2244. defacronym##1{realbackslash acronym {##1}}%
  2245. %
  2246. % Handle some cases of @value -- where the variable name does not
  2247. % contain - or _, and the value does not contain any
  2248. % (non-fully-expandable) commands.
  2249. letvalue = expandablevalue
  2250. %
  2251. unsepspaces
  2252. % Turn off macro expansion
  2253. turnoffmacros
  2254. }
  2255. % If an index command is used in an @example environment, any spaces
  2256. % therein should become regular spaces in the raw index file, not the
  2257. % expansion of tie (\leavevmode penalty @M  ).
  2258. {obeyspaces
  2259.  gdefunsepspaces{obeyspaceslet =space}}
  2260. % indexnofonts no-ops all font-change commands.
  2261. % This is used when outputting the strings to sort the index by.
  2262. defindexdummyfont#1{#1}
  2263. defindexdummytex{TeX}
  2264. defindexdummydots{...}
  2265. defindexnofonts{%
  2266. % Just ignore accents.
  2267. let,=indexdummyfont
  2268. let"=indexdummyfont
  2269. let`=indexdummyfont
  2270. let'=indexdummyfont
  2271. let^=indexdummyfont
  2272. let~=indexdummyfont
  2273. let==indexdummyfont
  2274. letb=indexdummyfont
  2275. letc=indexdummyfont
  2276. letd=indexdummyfont
  2277. letu=indexdummyfont
  2278. letv=indexdummyfont
  2279. letH=indexdummyfont
  2280. letdotless=indexdummyfont
  2281. % Take care of the plain tex special European modified letters.
  2282. defoe{oe}%
  2283. defae{ae}%
  2284. defaa{aa}%
  2285. defOE{OE}%
  2286. defAE{AE}%
  2287. defAA{AA}%
  2288. defo{o}%
  2289. defO{O}%
  2290. defl{l}%
  2291. defL{L}%
  2292. defss{ss}%
  2293. letw=indexdummyfont
  2294. lett=indexdummyfont
  2295. letr=indexdummyfont
  2296. leti=indexdummyfont
  2297. letb=indexdummyfont
  2298. letemph=indexdummyfont
  2299. letstrong=indexdummyfont
  2300. letcite=indexdummyfont
  2301. letsc=indexdummyfont
  2302. %Don't no-op tt, since it isn't a user-level command
  2303. % and is used in the definitions of the active chars like <, >, |...
  2304. %lettt=indexdummyfont
  2305. lettclose=indexdummyfont
  2306. letcode=indexdummyfont
  2307. leturl=indexdummyfont
  2308. leturef=indexdummyfont
  2309. letenv=indexdummyfont
  2310. letcommand=indexdummyfont
  2311. letoption=indexdummyfont
  2312. letfile=indexdummyfont
  2313. letsamp=indexdummyfont
  2314. letkbd=indexdummyfont
  2315. letkey=indexdummyfont
  2316. letvar=indexdummyfont
  2317. letTeX=indexdummytex
  2318. letdots=indexdummydots
  2319. def@{@}%
  2320. }
  2321. % To define realbackslash, we must make  not be an escape.
  2322. % We must first make another character (@) an escape
  2323. % so we do not become unable to do a definition.
  2324. {catcode`@=0 catcode`\=other
  2325.  @gdef@realbackslash{}}
  2326. letindexbackslash=0  %overridden during printindex.
  2327. letSETmarginindex=relax % put index entries in margin (undocumented)?
  2328. % For ifx comparisons.
  2329. defemptymacro{empty}
  2330. % Most index entries go through here, but dosubind is the general case.
  2331. %
  2332. defdoind#1#2{dosubind{#1}{#2}empty}
  2333. % Workhorse for all fooindexes.
  2334. % #1 is name of index, #2 is stuff to put there, #3 is subentry --
  2335. % empty if called from doind, as we usually are.  The main exception
  2336. % is with defuns, which call us directly.
  2337. %
  2338. defdosubind#1#2#3{%
  2339.   % Put the index entry in the margin if desired.
  2340.   ifxSETmarginindexrelaxelse
  2341.     insertmargin{hbox{vrule height8pt depth3pt width0pt #2}}%
  2342.   fi
  2343.   {%
  2344.     count255=lastpenalty
  2345.     {%
  2346.       indexdummies % Must do this here, since bf, etc expand at this stage
  2347.       escapechar=`\
  2348.       {%
  2349.         letfolio = 0% We will expand all macros now EXCEPT folio.
  2350.         defrawbackslashxx{indexbackslash}% indexbackslash isn't defined now
  2351.         % so it will be output as is; and it will print as backslash.
  2352.         %
  2353.         defthirdarg{#3}%
  2354.         %
  2355.         % If third arg is present, precede it with space in sort key.
  2356.         ifxthirdargemptymacro
  2357.           letsubentry = empty
  2358.         else
  2359.           defsubentry{ #3}%
  2360.         fi
  2361.         %
  2362.         % First process the index entry with all font commands turned
  2363.         % off to get the string to sort by.
  2364.         {indexnofonts xdefindexsorttmp{#2subentry}}%
  2365.         %
  2366.         % Now the real index entry with the fonts.
  2367.         toks0 = {#2}%
  2368.         %
  2369.         % If third (subentry) arg is present, add it to the index
  2370.         % string.  And include a space.
  2371.         ifxthirdargemptymacro else
  2372.           toks0 = expandafter{thetoks0 space #3}%
  2373.         fi
  2374.         %
  2375.         % Set up the complete index entry, with both the sort key
  2376.         % and the original text, including any font commands.  We write
  2377.         % three arguments to entry to the .?? file, texindex reduces to
  2378.         % two when writing the .??s sorted result.
  2379.         edeftemp{%
  2380.           writecsname#1indfileendcsname{%
  2381.             realbackslash entry{indexsorttmp}{folio}{thetoks0}}%
  2382.         }%
  2383.         %
  2384.         % If a skip is the last thing on the list now, preserve it
  2385.         % by backing up by lastskip, doing the write, then inserting
  2386.         % the skip again.  Otherwise, the whatsit generated by the
  2387.         % write will make lastskip zero.  The result is that sequences
  2388.         % like this:
  2389.         % @end defun
  2390.         % @tindex whatever
  2391.         % @defun ...
  2392.         % will have extra space inserted, because the medbreak in the
  2393.         % start of the @defun won't see the skip inserted by the @end of
  2394.         % the previous defun.
  2395.         %
  2396.         % But don't do any of this if we're not in vertical mode.  We
  2397.         % don't want to do a vskip and prematurely end a paragraph.
  2398.         %
  2399.         % Avoid page breaks due to these extra skips, too.
  2400.         %
  2401.         iflinks
  2402.           ifvmode
  2403.             skip0 = lastskip
  2404.             ifdimlastskip = 0pt else nobreakvskip-lastskip fi
  2405.           fi
  2406.           %
  2407.           temp % do the write
  2408.           %
  2409.           %
  2410.           ifvmode ifdimskip0 = 0pt else nobreakvskipskip0 fi fi
  2411.         fi
  2412.       }%
  2413.     }%
  2414.     penaltycount255
  2415.   }%
  2416. }
  2417. % The index entry written in the file actually looks like
  2418. %  entry {sortstring}{page}{topic}
  2419. % or
  2420. %  entry {sortstring}{page}{topic}{subtopic}
  2421. % The texindex program reads in these files and writes files
  2422. % containing these kinds of lines:
  2423. %  initial {c}
  2424. %     before the first topic whose initial is c
  2425. %  entry {topic}{pagelist}
  2426. %     for a topic that is used without subtopics
  2427. %  primary {topic}
  2428. %     for the beginning of a topic that is used with subtopics
  2429. %  secondary {subtopic}{pagelist}
  2430. %     for each subtopic.
  2431. % Define the user-accessible indexing commands
  2432. % @findex, @vindex, @kindex, @cindex.
  2433. deffindex {fnindex}
  2434. defkindex {kyindex}
  2435. defcindex {cpindex}
  2436. defvindex {vrindex}
  2437. deftindex {tpindex}
  2438. defpindex {pgindex}
  2439. defcindexsub {begingroupobeylinescindexsub}
  2440. {obeylines %
  2441. gdefcindexsub "#1" #2^^M{endgroup %
  2442. dosubind{cp}{#2}{#1}}}
  2443. % Define the macros used in formatting output of the sorted index material.
  2444. % @printindex causes a particular index (the ??s file) to get printed.
  2445. % It does not print any chapter heading (usually an @unnumbered).
  2446. %
  2447. defprintindex{parseargdoprintindex}
  2448. defdoprintindex#1{begingroup
  2449.   dobreak chapheadingskip{10000}%
  2450.   %
  2451.   indexfonts rm
  2452.   tolerance = 9500
  2453.   indexbreaks
  2454.   %
  2455.   % See if the index file exists and is nonempty.
  2456.   % Change catcode of @ here so that if the index file contains
  2457.   % initial {@}
  2458.   % as its first line, TeX doesn't complain about mismatched braces
  2459.   % (because it thinks @} is a control sequence).
  2460.   catcode`@ = 11
  2461.   openin 1 jobname.#1s
  2462.   ifeof 1
  2463.     % enddoublecolumns gets confused if there is no text in the index,
  2464.     % and it loses the chapter title and the aux file entries for the
  2465.     % index.  The easiest way to prevent this problem is to make sure
  2466.     % there is some text.
  2467.     putwordIndexNonexistent
  2468.   else
  2469.     %
  2470.     % If the index file exists but is empty, then openin leaves ifeof
  2471.     % false.  We have to make TeX try to read something from the file, so
  2472.     % it can discover if there is anything in it.
  2473.     read 1 to temp
  2474.     ifeof 1
  2475.       putwordIndexIsEmpty
  2476.     else
  2477.       % Index files are almost Texinfo source, but we use  as the escape
  2478.       % character.  It would be better to use @, but that's too big a change
  2479.       % to make right now.
  2480.       defindexbackslash{rawbackslashxx}%
  2481.       catcode`\ = 0
  2482.       escapechar = `\
  2483.       begindoublecolumns
  2484.       input jobname.#1s
  2485.       enddoublecolumns
  2486.     fi
  2487.   fi
  2488.   closein 1
  2489. endgroup}
  2490. % These macros are used by the sorted index file itself.
  2491. % Change them to control the appearance of the index.
  2492. definitial#1{{%
  2493.   % Some minor font changes for the special characters.
  2494.   lettentt=sectt lettt=sectt letsf=sectt
  2495.   %
  2496.   % Remove any glue we may have, we'll be inserting our own.
  2497.   removelastskip
  2498.   %
  2499.   % We like breaks before the index initials, so insert a bonus.
  2500.   penalty -300
  2501.   %
  2502.   % Typeset the initial.  Making this add up to a whole number of
  2503.   % baselineskips increases the chance of the dots lining up from column
  2504.   % to column.  It still won't often be perfect, because of the stretch
  2505.   % we need before each entry, but it's better.
  2506.   %
  2507.   % No shrink because it confuses balancecolumns.
  2508.   vskip 1.67baselineskip plus .5baselineskip
  2509.   leftline{secbf #1}%
  2510.   vskip .33baselineskip plus .1baselineskip
  2511.   %
  2512.   % Do our best not to break after the initial.
  2513.   nobreak
  2514. }}
  2515. % This typesets a paragraph consisting of #1, dot leaders, and then #2
  2516. % flush to the right margin.  It is used for index and table of contents
  2517. % entries.  The paragraph is indented by leftskip.
  2518. %
  2519. defentry#1#2{begingroup
  2520.   %
  2521.   % Start a new paragraph if necessary, so our assignments below can't
  2522.   % affect previous text.
  2523.   par
  2524.   %
  2525.   % Do not fill out the last line with white space.
  2526.   parfillskip = 0in
  2527.   %
  2528.   % No extra space above this paragraph.
  2529.   parskip = 0in
  2530.   %
  2531.   % Do not prefer a separate line ending with a hyphen to fewer lines.
  2532.   finalhyphendemerits = 0
  2533.   %
  2534.   % hangindent is only relevant when the entry text and page number