texinfo.tex
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:201k
源码类别:

Windows CE

开发平台:

C/C++

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