texinfo.tex
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:279k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. % texinfo.tex -- TeX macros to handle Texinfo files.
  2. %
  3. % Load plain if necessary, i.e., if running under initex.
  4. expandafterifxcsname fmtnameendcsnamerelaxinput plainfi
  5. %
  6. deftexinfoversion{2009-11-15.11}
  7. %
  8. % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
  9. % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
  10. % 2007, 2008 Free Software Foundation, Inc.
  11. %
  12. % This texinfo.tex file is free software: you can redistribute it and/or
  13. % modify it under the terms of the GNU General Public License as
  14. % published by the Free Software Foundation, either version 3 of the
  15. % License, or (at your option) any later version.
  16. %
  17. % This texinfo.tex file is distributed in the hope that it will be
  18. % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  19. % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20. % General Public License for more details.
  21. %
  22. % You should have received a copy of the GNU General Public License
  23. % along with this program.  If not, see <http://www.gnu.org/licenses/>.
  24. %
  25. % As a special exception, when this file is read by TeX when processing
  26. % a Texinfo source document, you may use the result without
  27. % restriction.  (This has been our intent since Texinfo was invented.)
  28. %
  29. % Please try the latest version of texinfo.tex before submitting bug
  30. % reports; you can get the latest version from:
  31. %   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
  32. %   ftp://tug.org/tex/texinfo.tex
  33. %     (and all CTAN mirrors, see http://www.ctan.org).
  34. % The texinfo.tex in any given distribution could well be out
  35. % of date, so if that's what you're using, please check.
  36. %
  37. % Send bug reports to bug-texinfo@gnu.org.  Please include including a
  38. % complete document in each bug report with which we can reproduce the
  39. % problem.  Patches are, of course, greatly appreciated.
  40. %
  41. % To process a Texinfo manual with TeX, it's most reliable to use the
  42. % texi2dvi shell script that comes with the distribution.  For a simple
  43. % manual foo.texi, however, you can get away with this:
  44. %   tex foo.texi
  45. %   texindex foo.??
  46. %   tex foo.texi
  47. %   tex foo.texi
  48. %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
  49. % The extra TeX runs get the cross-reference information correct.
  50. % Sometimes one run after texindex suffices, and sometimes you need more
  51. % than two; texi2dvi does it as many times as necessary.
  52. %
  53. % It is possible to adapt texinfo.tex for other languages, to some
  54. % extent.  You can get the existing language-specific files from the
  55. % full Texinfo distribution.
  56. %
  57. % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
  58. message{Loading texinfo [version texinfoversion]:}
  59. % If in a .fmt file, print the version number
  60. % and turn on active characters that we couldn't do earlier because
  61. % they might have appeared in the input file name.
  62. everyjob{message{[Texinfo version texinfoversion]}%
  63.   catcode`+=active catcode`_=active}
  64. chardefother=12
  65. % We never want plain's outer definition of + in Texinfo.
  66. % For @tex, we can use tabalign.
  67. let+ = relax
  68. % Save some plain tex macros whose names we will redefine.
  69. letptexb=b
  70. letptexbullet=bullet
  71. letptexc=c
  72. letptexcomma=,
  73. letptexdot=.
  74. letptexdots=dots
  75. letptexend=end
  76. letptexequiv=equiv
  77. letptexexclam=!
  78. letptexfootnote=footnote
  79. letptexgtr=>
  80. letptexhat=^
  81. letptexi=i
  82. letptexindent=indent
  83. letptexinsert=insert
  84. letptexlbrace={
  85. letptexless=<
  86. letptexnewwritenewwrite
  87. letptexnoindent=noindent
  88. letptexplus=+
  89. letptexrbrace=}
  90. letptexslash=/
  91. letptexstar=*
  92. letptext=t
  93. letptextop=top
  94. % If this character appears in an error message or help string, it
  95. % starts a new line in the output.
  96. newlinechar = `^^J
  97. % Use TeX 3.0's inputlineno to get the line number, for better error
  98. % messages, but if we're using an old version of TeX, don't do anything.
  99. %
  100. ifxinputlinenothisisundefined
  101.   letlinenumber = empty % Pre-3.0.
  102. else
  103.   deflinenumber{l.theinputlineno:space}
  104. fi
  105. % Set up fixed words for English if not already set.
  106. ifxputwordAppendixundefined  gdefputwordAppendix{Appendix}fi
  107. ifxputwordChapterundefined   gdefputwordChapter{Chapter}fi
  108. ifxputwordfileundefined      gdefputwordfile{file}fi
  109. ifxputwordinundefined        gdefputwordin{in}fi
  110. ifxputwordIndexIsEmptyundefined     gdefputwordIndexIsEmpty{(Index is empty)}fi
  111. ifxputwordIndexNonexistentundefined gdefputwordIndexNonexistent{(Index is nonexistent)}fi
  112. ifxputwordInfoundefined      gdefputwordInfo{Info}fi
  113. ifxputwordInstanceVariableofundefined gdefputwordInstanceVariableof{Instance Variable of}fi
  114. ifxputwordMethodonundefined  gdefputwordMethodon{Method on}fi
  115. ifxputwordNoTitleundefined   gdefputwordNoTitle{No Title}fi
  116. ifxputwordofundefined        gdefputwordof{of}fi
  117. ifxputwordonundefined        gdefputwordon{on}fi
  118. ifxputwordpageundefined      gdefputwordpage{page}fi
  119. ifxputwordsectionundefined   gdefputwordsection{section}fi
  120. ifxputwordSectionundefined   gdefputwordSection{Section}fi
  121. ifxputwordseeundefined       gdefputwordsee{see}fi
  122. ifxputwordSeeundefined       gdefputwordSee{See}fi
  123. ifxputwordShortTOCundefined  gdefputwordShortTOC{Short Contents}fi
  124. ifxputwordTOCundefined       gdefputwordTOC{Table of Contents}fi
  125. %
  126. ifxputwordMJanundefined gdefputwordMJan{January}fi
  127. ifxputwordMFebundefined gdefputwordMFeb{February}fi
  128. ifxputwordMMarundefined gdefputwordMMar{March}fi
  129. ifxputwordMAprundefined gdefputwordMApr{April}fi
  130. ifxputwordMMayundefined gdefputwordMMay{May}fi
  131. ifxputwordMJunundefined gdefputwordMJun{June}fi
  132. ifxputwordMJulundefined gdefputwordMJul{July}fi
  133. ifxputwordMAugundefined gdefputwordMAug{August}fi
  134. ifxputwordMSepundefined gdefputwordMSep{September}fi
  135. ifxputwordMOctundefined gdefputwordMOct{October}fi
  136. ifxputwordMNovundefined gdefputwordMNov{November}fi
  137. ifxputwordMDecundefined gdefputwordMDec{December}fi
  138. %
  139. ifxputwordDefmacundefined    gdefputwordDefmac{Macro}fi
  140. ifxputwordDefspecundefined   gdefputwordDefspec{Special Form}fi
  141. ifxputwordDefvarundefined    gdefputwordDefvar{Variable}fi
  142. ifxputwordDefoptundefined    gdefputwordDefopt{User Option}fi
  143. ifxputwordDeffuncundefined   gdefputwordDeffunc{Function}fi
  144. % Since the category of space is not known, we have to be careful.
  145. chardefspacecat = 10
  146. defspaceisspace{catcode` =spacecat}
  147. % sometimes characters are active, so we need control sequences.
  148. chardefcolonChar = `:
  149. chardefcommaChar = `,
  150. chardefdashChar  = `-
  151. chardefdotChar   = `.
  152. chardefexclamChar= `!
  153. chardeflquoteChar= ``
  154. chardefquestChar = `?
  155. chardefrquoteChar= `'
  156. chardefsemiChar  = `;
  157. chardefunderChar = `_
  158. % Ignore a token.
  159. %
  160. defgobble#1{}
  161. % The following is used inside several edef's.
  162. defmakecsname#1{expandafternoexpandcsname#1endcsname}
  163. % Hyphenation fixes.
  164. hyphenation{
  165.   Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
  166.   ap-pen-dix bit-map bit-maps
  167.   data-base data-bases eshell fall-ing half-way long-est man-u-script
  168.   man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
  169.   par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
  170.   spell-ing spell-ings
  171.   stand-alone strong-est time-stamp time-stamps which-ever white-space
  172.   wide-spread wrap-around
  173. }
  174. % Margin to add to right of even pages, to left of odd pages.
  175. newdimenbindingoffset
  176. newdimennormaloffset
  177. newdimenpagewidth newdimenpageheight
  178. % For a final copy, take out the rectangles
  179. % that mark overfull boxes (in case you have decided
  180. % that the text looks ok even though it passes the margin).
  181. %
  182. deffinalout{overfullrule=0pt}
  183. % @| inserts a changebar to the left of the current line.  It should
  184. % surround any changed text.  This approach does *not* work if the
  185. % change spans more than two lines of output.  To handle that, we would
  186. % have adopt a much more difficult approach (putting marks into the main
  187. % vertical list for the beginning and end of each change).
  188. %
  189. def|{%
  190.   % vadjust can only be used in horizontal mode.
  191.   leavevmode
  192.   %
  193.   % Append this vertical mode material after the current line in the output.
  194.   vadjust{%
  195.     % We want to insert a rule with the height and depth of the current
  196.     % leading; that is exactly what strutbox is supposed to record.
  197.     vskip-baselineskip
  198.     %
  199.     % vadjust-items are inserted at the left edge of the type.  So
  200.     % the llap here moves out into the left-hand margin.
  201.     llap{%
  202.       %
  203.       % For a thicker or thinner bar, change the `1pt'.
  204.       vrule heightbaselineskip width1pt
  205.       %
  206.       % This is the space between the bar and the text.
  207.       hskip 12pt
  208.     }%
  209.   }%
  210. }
  211. % Sometimes it is convenient to have everything in the transcript file
  212. % and nothing on the terminal.  We don't just call tracingall here,
  213. % since that produces some useless output on the terminal.  We also make
  214. % some effort to order the tracing commands to reduce output in the log
  215. % file; cf. trace.sty in LaTeX.
  216. %
  217. defgloggingall{begingroup globaldefs = 1 loggingall endgroup}%
  218. defloggingall{%
  219.   tracingstats2
  220.   tracingpages1
  221.   tracinglostchars2  % 2 gives us more in etex
  222.   tracingparagraphs1
  223.   tracingoutput1
  224.   tracingmacros2
  225.   tracingrestores1
  226.   showboxbreadthmaxdimen showboxdepthmaxdimen
  227.   ifxeTeXversionundefinedelse % etex gives us more logging
  228.     tracingscantokens1
  229.     tracingifs1
  230.     tracinggroups1
  231.     tracingnesting2
  232.     tracingassigns1
  233.   fi
  234.   tracingcommands3  % 3 gives us more in etex
  235.   errorcontextlines16
  236. }%
  237. % add check for lastpenalty to plain's definitions.  If the last thing
  238. % we did was a nobreak, we don't want to insert more space.
  239. %
  240. defsmallbreak{ifnumlastpenalty<10000parifdimlastskip<smallskipamount
  241.   removelastskippenalty-50smallskipfifi}
  242. defmedbreak{ifnumlastpenalty<10000parifdimlastskip<medskipamount
  243.   removelastskippenalty-100medskipfifi}
  244. defbigbreak{ifnumlastpenalty<10000parifdimlastskip<bigskipamount
  245.   removelastskippenalty-200bigskipfifi}
  246. % For @cropmarks command.
  247. % Do @cropmarks to get crop marks.
  248. %
  249. newififcropmarks
  250. letcropmarks = cropmarkstrue
  251. %
  252. % Dimensions to add cropmarks at corners.
  253. % Added by P. A. MacKay, 12 Nov. 1986
  254. %
  255. newdimenouterhsize newdimenoutervsize % set by the paper size routines
  256. newdimencornerlong  cornerlong=1pc
  257. newdimencornerthick cornerthick=.3pt
  258. newdimentopandbottommargin topandbottommargin=.75in
  259. % Output a mark which sets thischapter, thissection and thiscolor.
  260. % We dump everything together because we only have one kind of mark.
  261. % This works because we only use botmark / topmark, not firstmark.
  262. %
  263. % A mark contains a subexpression of the ifcase ... fi construct.
  264. % get*marks macros below extract the needed part using ifcase.
  265. %
  266. % Another complication is to let the user choose whether thischapter
  267. % (thissection) refers to the chapter (section) in effect at the top
  268. % of a page, or that at the bottom of a page.  The solution is
  269. % described on page 260 of The TeXbook.  It involves outputting two
  270. % marks for the sectioning macros, one before the section break, and
  271. % one after.  I won't pretend I can describe this better than DEK...
  272. defdomark{%
  273.   toks0=expandafter{lastchapterdefs}%
  274.   toks2=expandafter{lastsectiondefs}%
  275.   toks4=expandafter{prevchapterdefs}%
  276.   toks6=expandafter{prevsectiondefs}%
  277.   toks8=expandafter{lastcolordefs}%
  278.   mark{%
  279.                    thetoks0 thetoks2
  280.       noexpandor thetoks4 thetoks6
  281.     noexpandelse thetoks8
  282.   }%
  283. }
  284. % topmark doesn't work for the very first chapter (after the title
  285. % page or the contents), so we use firstmark there -- this gets us
  286. % the mark with the chapter defs, unless the user sneaks in, e.g.,
  287. % @setcolor (or @url, or @link, etc.) between @contents and the very
  288. % first @chapter.
  289. defgettopheadingmarks{%
  290.   ifcase0topmarkfi
  291.   ifxthischapterempty ifcase0firstmarkfi fi
  292. }
  293. defgetbottomheadingmarks{ifcase1botmarkfi}
  294. defgetcolormarks{ifcase2topmarkfi}
  295. % Avoid "undefined control sequence" errors.
  296. deflastchapterdefs{}
  297. deflastsectiondefs{}
  298. defprevchapterdefs{}
  299. defprevsectiondefs{}
  300. deflastcolordefs{}
  301. % Main output routine.
  302. chardefPAGE = 255
  303. output = {onepageout{pagecontentsPAGE}}
  304. newboxheadlinebox
  305. newboxfootlinebox
  306. % onepageout takes a vbox as an argument.  Note that pagecontents
  307. % does insertions, but you have to call it yourself.
  308. defonepageout#1{%
  309.   ifcropmarks hoffset=0pt else hoffset=normaloffset fi
  310.   %
  311.   ifoddpageno  advancehoffset by bindingoffset
  312.   else advancehoffset by -bindingoffsetfi
  313.   %
  314.   % Do this outside of the shipout so @code etc. will be expanded in
  315.   % the headline as they should be, not taken literally (outputting ''code).
  316.   ifoddpageno getoddheadingmarks else getevenheadingmarks fi
  317.   setboxheadlinebox = vbox{lethsize=pagewidth makeheadline}%
  318.   ifoddpageno getoddfootingmarks else getevenfootingmarks fi
  319.   setboxfootlinebox = vbox{lethsize=pagewidth makefootline}%
  320.   %
  321.   {%
  322.     % Have to do this stuff outside the shipout because we want it to
  323.     % take effect in write's, yet the group defined by the vbox ends
  324.     % before the shipout runs.
  325.     %
  326.     indexdummies         % don't expand commands in the output.
  327.     normalturnoffactive  %  in index entries must not stay , e.g., if
  328.                % the page break happens to be in the middle of an example.
  329.                % We don't want .vr (or whatever) entries like this:
  330.                % entry{{tt indexbackslash }acronym}{32}{code {acronym}}
  331.                % "acronym" won't work when it's read back in;
  332.                % it needs to be 
  333.                % {code {{tt backslashcurfont }acronym}
  334.     shipoutvbox{%
  335.       % Do this early so pdf references go to the beginning of the page.
  336.       ifpdfmakepagedest pdfdest name{thepageno} xyzfi
  337.       %
  338.       ifcropmarks vbox to outervsizebgroup
  339.         hsize = outerhsize
  340.         vskip-topandbottommargin
  341.         vtop to0pt{%
  342.           line{ewtophfilewtop}%
  343.           nointerlineskip
  344.           line{%
  345.             vbox{moveleftcornerthicknstop}%
  346.             hfill
  347.             vbox{moverightcornerthicknstop}%
  348.           }%
  349.           vss}%
  350.         vskiptopandbottommargin
  351.         linebgroup
  352.           hfil % center the page within the outer (page) hsize.
  353.           ifoddpagenohskipbindingoffsetfi
  354.           vboxbgroup
  355.       fi
  356.       %
  357.       unvboxheadlinebox
  358.       pagebody{#1}%
  359.       ifdimhtfootlinebox > 0pt
  360.         % Only leave this space if the footline is nonempty.
  361.         % (We lessened vsize for it in oddfootingyyy.)
  362.         % The baselineskip=24pt in plain's makefootline has no effect.
  363.         vskip 24pt
  364.         unvboxfootlinebox
  365.       fi
  366.       %
  367.       ifcropmarks
  368.           egroup % end of vboxbgroup
  369.         hfilegroup % end of (centering) linebgroup
  370.         vskiptopandbottommargin plus1fill minus1fill
  371.         boxmaxdepth = cornerthick
  372.         vbox to0pt{vss
  373.           line{%
  374.             vbox{moveleftcornerthicknsbot}%
  375.             hfill
  376.             vbox{moverightcornerthicknsbot}%
  377.           }%
  378.           nointerlineskip
  379.           line{ewbothfilewbot}%
  380.         }%
  381.       egroup % vbox from first cropmarks clause
  382.       fi
  383.     }% end of shipoutvbox
  384.   }% end of group with indexdummies
  385.   advancepageno
  386.   ifnumoutputpenalty>-20000 elsedosuperejectfi
  387. }
  388. newinsertmargin dimenmargin=maxdimen
  389. defpagebody#1{vbox topageheight{boxmaxdepth=maxdepth #1}}
  390. {catcode`@ =11
  391. gdefpagecontents#1{ifvoidtopinselseunvboxtopinsfi
  392. % marginal hacks, juha@viisa.uucp (Juha Takala)
  393. ifvoidmarginelse % marginal info is present
  394.   rlap{kernhsizevbox toz@{kern1ptboxmargin vss}}fi
  395. dimen@=dp#1relax unvbox#1relax
  396. ifvoidfootinselsevskipskipfootinsfootnoterule unvboxfootinsfi
  397. ifr@ggedbottom kern-dimen@ vfil fi}
  398. }
  399. % Here are the rules for the cropmarks.  Note that they are
  400. % offset so that the space between them is truly outerhsize or outervsize
  401. % (P. A. MacKay, 12 November, 1986)
  402. %
  403. defewtop{vrule heightcornerthick depth0pt widthcornerlong}
  404. defnstop{vbox
  405.   {hrule heightcornerthick depthcornerlong widthcornerthick}}
  406. defewbot{vrule height0pt depthcornerthick widthcornerlong}
  407. defnsbot{vbox
  408.   {hrule heightcornerlong depthcornerthick widthcornerthick}}
  409. % Parse an argument, then pass it to #1.  The argument is the rest of
  410. % the input line (except we remove a trailing comment).  #1 should be a
  411. % macro which expects an ordinary undelimited TeX argument.
  412. %
  413. defparsearg{parseargusing{}}
  414. defparseargusing#1#2{%
  415.   defargtorun{#2}%
  416.   begingroup
  417.     obeylines
  418.     spaceisspace
  419.     #1%
  420.     parsearglineempty% Insert the empty token, see finishparsearg below.
  421. }
  422. {obeylines %
  423.   gdefparseargline#1^^M{%
  424.     endgroup % End of the group started in parsearg.
  425.     argremovecomment #1commentArgTerm%
  426.   }%
  427. }
  428. % First remove any @comment, then any @c comment.
  429. defargremovecomment#1comment#2ArgTerm{argremovec #1cArgTerm}
  430. defargremovec#1c#2ArgTerm{argcheckspaces#1^^MArgTerm}
  431. % Each occurrence of `^^M' or `<space>^^M' is replaced by a single space.
  432. %
  433. % argremovec might leave us with trailing space, e.g.,
  434. %    @end itemize  @c foo
  435. % This space token undergoes the same procedure and is eventually removed
  436. % by finishparsearg.
  437. %
  438. defargcheckspaces#1^^M{argcheckspacesX#1^^M ^^M}
  439. defargcheckspacesX#1 ^^M{argcheckspacesY#1^^M}
  440. defargcheckspacesY#1^^M#2^^M#3ArgTerm{%
  441.   deftemp{#3}%
  442.   ifxtempempty
  443.     % Do not use next, perhaps the caller of parsearg uses it; reuse temp:
  444.     lettempfinishparsearg
  445.   else
  446.     lettempargcheckspaces
  447.   fi
  448.   % Put the space token in:
  449.   temp#1 #3ArgTerm
  450. }
  451. % If a _delimited_ argument is enclosed in braces, they get stripped; so
  452. % to get _exactly_ the rest of the line, we had to prevent such situation.
  453. % We prepended an empty token at the very beginning and we expand it now,
  454. % just before passing the control to argtorun.
  455. % (Similarly, we have to think about #3 of argcheckspacesY above: it is
  456. % either the null string, or it ends with ^^M---thus there is no danger
  457. % that a pair of braces would be stripped.
  458. %
  459. % But first, we have to remove the trailing space token.
  460. %
  461. deffinishparsearg#1 ArgTerm{expandafterargtorunexpandafter{#1}}
  462. % parseargdeffoo{...}
  463. % is roughly equivalent to
  464. % deffoo{parseargXfoo}
  465. % defXfoo#1{...}
  466. %
  467. % Actually, I use csnamestringfooendcsname, ie. \foo, as it is my
  468. % favourite TeX trick.  --kasal, 16nov03
  469. defparseargdef#1{%
  470.   expandafter doparseargdef csnamestring#1endcsname #1%
  471. }
  472. defdoparseargdef#1#2{%
  473.   def#2{parsearg#1}%
  474.   def#1##1%
  475. }
  476. % Several utility definitions with active space:
  477. {
  478.   obeyspaces
  479.   gdefobeyedspace{ }
  480.   % Make each space character in the input produce a normal interword
  481.   % space in the output.  Don't allow a line break at this space, as this
  482.   % is used only in environments like @example, where each line of input
  483.   % should produce a line of output anyway.
  484.   %
  485.   gdefsepspaces{obeyspaceslet =tie}
  486.   % If an index command is used in an @example environment, any spaces
  487.   % therein should become regular spaces in the raw index file, not the
  488.   % expansion of tie (leavevmode penalty @M  ).
  489.   gdefunsepspaces{let =space}
  490. }
  491. defflushcr{ifxparlisppar defnext##1{}else letnext=relax fi next}
  492. % Define the framework for environments in texinfo.tex.  It's used like this:
  493. %
  494. %   envdeffoo{...}
  495. %   defEfoo{...}
  496. %
  497. % It's the responsibility of envdef to insert begingroup before the
  498. % actual body; @end closes the group after calling Efoo.  envdef also
  499. % defines thisenv, so the current environment is known; @end checks
  500. % whether the environment name matches.  The checkenv macro can also be
  501. % used to check whether the current environment is the one expected.
  502. %
  503. % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
  504. % are not treated as environments; they don't open a group.  (The
  505. % implementation of @end takes care not to call endgroup in this
  506. % special case.)
  507. % At run-time, environments start with this:
  508. defstartenvironment#1{begingroupdefthisenv{#1}}
  509. % initialize
  510. letthisenvempty
  511. % ... but they get defined via ``envdeffoo{...}'':
  512. longdefenvdef#1#2{def#1{startenvironment#1#2}}
  513. defenvparseargdef#1#2{parseargdef#1{startenvironment#1#2}}
  514. % Check whether we're in the right environment:
  515. defcheckenv#1{%
  516.   deftemp{#1}%
  517.   ifxthisenvtemp
  518.   else
  519.     badenverr
  520.   fi
  521. }
  522. % Environment mismatch, #1 expected:
  523. defbadenverr{%
  524.   errhelp = EMsimple
  525.   errmessage{This command can appear only inenvironmenttemp,
  526.     not inenvironmentthisenv}%
  527. }
  528. definenvironment#1{%
  529.   ifx#1empty
  530.     out of any environment%
  531.   else
  532.     in environment expandafterstring#1%
  533.   fi
  534. }
  535. % @end foo executes the definition of Efoo.
  536. % But first, it executes a specialized version of checkenv
  537. %
  538. parseargdefend{%
  539.   if 1csname iscond.#1endcsname
  540.   else
  541.     % The general wording of badenverr may not be ideal, but... --kasal, 06nov03
  542.     expandaftercheckenvcsname#1endcsname
  543.     csname E#1endcsname
  544.     endgroup
  545.   fi
  546. }
  547. newhelpEMsimple{Press RETURN to continue.}
  548. %% Simple single-character @ commands
  549. % @@ prints an @
  550. % Kludge this until the fonts are right (grr).
  551. def@{{ttchar64}}
  552. % This is turned off because it was never documented
  553. % and you can use @w{...} around a quote to suppress ligatures.
  554. %% Define @` and @' to be the same as ` and '
  555. %% but suppressing ligatures.
  556. %def`{{`}}
  557. %def'{{'}}
  558. % Used to generate quoted braces.
  559. defmylbrace {{ttchar123}}
  560. defmyrbrace {{ttchar125}}
  561. let{=mylbrace
  562. let}=myrbrace
  563. begingroup
  564.   % Definitions to produce { and } commands for indices,
  565.   % and @{ and @} for the aux/toc files.
  566.   catcode`{ = other catcode`} = other
  567.   catcode`[ = 1 catcode`] = 2
  568.   catcode`! = 0 catcode`\ = other
  569.   !gdef!lbracecmd[{]%
  570.   !gdef!rbracecmd[}]%
  571.   !gdef!lbraceatcmd[@{]%
  572.   !gdef!rbraceatcmd[@}]%
  573. !endgroup
  574. % @comma{} to avoid , parsing problems.
  575. letcomma = ,
  576. % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
  577. % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
  578. let, = c
  579. letdotaccent = .
  580. defringaccent#1{{accent23 #1}}
  581. lettieaccent = t
  582. letubaraccent = b
  583. letudotaccent = d
  584. % Other special characters: @questiondown @exclamdown @ordf @ordm
  585. % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
  586. defquestiondown{?`}
  587. defexclamdown{!`}
  588. defordf{leavevmoderaise1exhbox{selectfontslllsize underbar{a}}}
  589. defordm{leavevmoderaise1exhbox{selectfontslllsize underbar{o}}}
  590. % Dotless i and dotless j, used for accents.
  591. defimacro{i}
  592. defjmacro{j}
  593. defdotless#1{%
  594.   deftemp{#1}%
  595.   ifxtempimacro ifmmodeimath elseptexi fi
  596.   elseifxtempjmacro ifmmodejmath elsej fi
  597.   else errmessage{@dotless can be used only with i or j}%
  598.   fifi
  599. }
  600. % The TeX{} logo, as in plain, but resetting the spacing so that a
  601. % period following counts as ending a sentence.  (Idea found in latex.)
  602. %
  603. edefTeX{TeX spacefactor=1000 }
  604. % @LaTeX{} logo.  Not quite the same results as the definition in
  605. % latex.ltx, since we use a different font for the raised A; it's most
  606. % convenient for us to use an explicitly smaller font, rather than using
  607. % the scriptstyle font (since we don't reset scriptstyle and
  608. % scriptscriptstyle).
  609. %
  610. defLaTeX{%
  611.   Lkern-.36em
  612.   {setbox0=hbox{T}%
  613.    vbox to ht0{hbox{selectfontslllsize A}vss}}%
  614.   kern-.15em
  615.   TeX
  616. }
  617. % Be sure we're in horizontal mode when doing a tie, since we make space
  618. % equivalent to this in @example-like environments. Otherwise, a space
  619. % at the beginning of a line will start with penalty -- and
  620. % since penalty is valid in vertical mode, we'd end up putting the
  621. % penalty on the vertical list instead of in the new paragraph.
  622. {catcode`@ = 11
  623.  % Avoid using @M directly, because that causes trouble
  624.  % if the definition is written into an index file.
  625.  globallettiepenalty = @M
  626.  gdeftie{leavevmodepenaltytiepenalty }
  627. }
  628. % @: forces normal size whitespace following.
  629. def:{spacefactor=1000 }
  630. % @* forces a line break.
  631. def*{hfilbreakhbox{}ignorespaces}
  632. % @/ allows a line break.
  633. let/=allowbreak
  634. % @. is an end-of-sentence period.
  635. def.{.spacefactor=endofsentencespacefactorspace}
  636. % @! is an end-of-sentence bang.
  637. def!{!spacefactor=endofsentencespacefactorspace}
  638. % @? is an end-of-sentence query.
  639. def?{?spacefactor=endofsentencespacefactorspace}
  640. % @frenchspacing on|off  says whether to put extra space after punctuation.
  641. defonword{on}
  642. defoffword{off}
  643. %
  644. parseargdeffrenchspacing{%
  645.   deftemp{#1}%
  646.   ifxtemponword plainfrenchspacing
  647.   elseifxtempoffword plainnonfrenchspacing
  648.   else
  649.     errhelp = EMsimple
  650.     errmessage{Unknown @frenchspacing option `temp', must be on/off}%
  651.   fifi
  652. }
  653. % @w prevents a word break.  Without the leavevmode, @w at the
  654. % beginning of a paragraph, when TeX is still in vertical mode, would
  655. % produce a whole line of output instead of starting the paragraph.
  656. defw#1{leavevmodehbox{#1}}
  657. % @group ... @end group forces ... to be all on one page, by enclosing
  658. % it in a TeX vbox.  We use vtop instead of vbox to construct the box
  659. % to keep its height that of a normal line.  According to the rules for
  660. % topskip (p.114 of the TeXbook), the glue inserted is
  661. % max (topskip - ht (first item), 0).  If that height is large,
  662. % therefore, no glue is inserted, and the space between the headline and
  663. % the text is small, which looks bad.
  664. %
  665. % Another complication is that the group might be very large.  This can
  666. % cause the glue on the previous page to be unduly stretched, because it
  667. % does not have much material.  In this case, it's better to add an
  668. % explicit vfill so that the extra space is at the bottom.  The
  669. % threshold for doing this is if the group is more than vfilllimit
  670. % percent of a page (vfilllimit can be changed inside of @tex).
  671. %
  672. newboxgroupbox
  673. defvfilllimit{0.7}
  674. %
  675. envdefgroup{%
  676.   ifnumcatcode`^^M=active else
  677.     errhelp = groupinvalidhelp
  678.     errmessage{@group invalid in context where filling is enabled}%
  679.   fi
  680.   startsavinginserts
  681.   %
  682.   setboxgroupbox = vtopbgroup
  683.     % Do @comment since we are called inside an environment such as
  684.     % @example, where each end-of-line in the input causes an
  685.     % end-of-line in the output.  We don't want the end-of-line after
  686.     % the `@group' to put extra space in the output.  Since @group
  687.     % should appear on a line by itself (according to the Texinfo
  688.     % manual), we don't worry about eating any user text.
  689.     comment
  690. }
  691. %
  692. % The vtop produces a box with normal height and large depth; thus, TeX puts
  693. % baselineskip glue before it, and (when the next line of text is done)
  694. % lineskip glue after it.  Thus, space below is not quite equal to space
  695. % above.  But it's pretty close.
  696. defEgroup{%
  697.     % To get correct interline space between the last line of the group
  698.     % and the first line afterwards, we have to propagate prevdepth.
  699.     endgraf % Not par, as it may have been set to lisppar.
  700.     globaldimen1 = prevdepth
  701.   egroup           % End the vtop.
  702.   % dimen0 is the vertical size of the group's box.
  703.   dimen0 = htgroupbox  advancedimen0 by dpgroupbox
  704.   % dimen2 is how much space is left on the page (more or less).
  705.   dimen2 = pageheight   advancedimen2 by -pagetotal
  706.   % if the group doesn't fit on the current page, and it's a big big
  707.   % group, force a page break.
  708.   ifdim dimen0 > dimen2
  709.     ifdim pagetotal < vfilllimitpageheight
  710.       page
  711.     fi
  712.   fi
  713.   boxgroupbox
  714.   prevdepth = dimen1
  715.   checkinserts
  716. }
  717. %
  718. % TeX puts in an escapechar (i.e., `@') at the beginning of the help
  719. % message, so this ends up printing `@group can only ...'.
  720. %
  721. newhelpgroupinvalidhelp{%
  722. group can only be used in environments such as @example,^^J%
  723. where each line of input produces a line of output.}
  724. % @need space-in-mils
  725. % forces a page break if there is not space-in-mils remaining.
  726. newdimenmil  mil=0.001in
  727. % Old definition--didn't work.
  728. %parseargdefneed{par %
  729. %% This method tries to make TeX break the page naturally
  730. %% if the depth of the box does not fit.
  731. %{baselineskip=0pt%
  732. %vtop to #1mil{vfil}kern -#1milnobreak
  733. %prevdepth=-1000pt
  734. %}}
  735. parseargdefneed{%
  736.   % Ensure vertical mode, so we don't make a big box in the middle of a
  737.   % paragraph.
  738.   par
  739.   %
  740.   % If the @need value is less than one line space, it's useless.
  741.   dimen0 = #1mil
  742.   dimen2 = htstrutbox
  743.   advancedimen2 by dpstrutbox
  744.   ifdimdimen0 > dimen2
  745.     %
  746.     % Do a strut just to make the height of this box be normal, so the
  747.     % normal leading is inserted relative to the preceding line.
  748.     % And a page break here is fine.
  749.     vtop to #1mil{strutvfil}%
  750.     %
  751.     % TeX does not even consider page breaks if a penalty added to the
  752.     % main vertical list is 10000 or more.  But in order to see if the
  753.     % empty box we just added fits on the page, we must make it consider
  754.     % page breaks.  On the other hand, we don't want to actually break the
  755.     % page after the empty box.  So we use a penalty of 9999.
  756.     %
  757.     % There is an extremely small chance that TeX will actually break the
  758.     % page at this penalty, if there are no other feasible breakpoints in
  759.     % sight.  (If the user is using lots of big @group commands, which
  760.     % almost-but-not-quite fill up a page, TeX will have a hard time doing
  761.     % good page breaking, for example.)  However, I could not construct an
  762.     % example where a page broke at this penalty; if it happens in a real
  763.     % document, then we can reconsider our strategy.
  764.     penalty9999
  765.     %
  766.     % Back up by the size of the box, whether we did a page break or not.
  767.     kern -#1mil
  768.     %
  769.     % Do not allow a page break right after this kern.
  770.     nobreak
  771.   fi
  772. }
  773. % @br   forces paragraph break (and is undocumented).
  774. letbr = par
  775. % @page forces the start of a new page.
  776. %
  777. defpage{parvfillsupereject}
  778. % @exdent text....
  779. % outputs text on separate line in roman font, starting at standard page margin
  780. % This records the amount of indent in the innermost environment.
  781. % That's how much exdent should take out.
  782. newskipexdentamount
  783. % This defn is used inside fill environments such as @defun.
  784. parseargdefexdent{hfilbreakhbox{kern -exdentamount{rm#1}}hfilbreak}
  785. % This defn is used inside nofill environments such as @example.
  786. parseargdefnofillexdent{{advance leftskip by -exdentamount
  787.   leftline{hskipleftskip{rm#1}}}}
  788. % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
  789. % paragraph.  For more general purposes, use the margin insertion
  790. % class.  WHICH is `l' or `r'.
  791. %
  792. newskipinmarginspacing inmarginspacing=1cm
  793. defstrutdepth{dpstrutbox}
  794. %
  795. defdoinmargin#1#2{strutvadjust{%
  796.   nobreak
  797.   kern-strutdepth
  798.   vtop to strutdepth{%
  799.     baselineskip=strutdepth
  800.     vss
  801.     % if you have multiple lines of stuff to put here, you'll need to
  802.     % make the vbox yourself of the appropriate size.
  803.     ifx#1l%
  804.       llap{ignorespaces #2hskipinmarginspacing}%
  805.     else
  806.       rlap{hskiphsize hskipinmarginspacing ignorespaces #2}%
  807.     fi
  808.     null
  809.   }%
  810. }}
  811. definleftmargin{doinmargin l}
  812. definrightmargin{doinmargin r}
  813. %
  814. % @inmargin{TEXT [, RIGHT-TEXT]}
  815. % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
  816. % else use TEXT for both).
  817. %
  818. definmargin#1{parseinmargin #1,,finish}
  819. defparseinmargin#1,#2,#3finish{% not perfect, but better than nothing.
  820.   setbox0 = hbox{ignorespaces #2}%
  821.   ifdimwd0 > 0pt
  822.     deflefttext{#1}%  have both texts
  823.     defrighttext{#2}%
  824.   else
  825.     deflefttext{#1}%  have only one text
  826.     defrighttext{#1}%
  827.   fi
  828.   %
  829.   ifoddpageno
  830.     deftemp{inrightmarginrighttext}% odd page -> outside is right margin
  831.   else
  832.     deftemp{inleftmarginlefttext}%
  833.   fi
  834.   temp
  835. }
  836. % @include FILE -- input text of FILE.
  837. %
  838. definclude{parseargusingfilenamecatcodesincludezzz}
  839. defincludezzz#1{%
  840.   pushthisfilestack
  841.   defthisfile{#1}%
  842.   {%
  843.     makevalueexpandable  % we want to expand any @value in FILE.
  844.     turnoffactive        % and allow special characters in the expansion
  845.     edeftemp{noexpandinput #1 }%
  846.     %
  847.     % This trickery is to read FILE outside of a group, in case it makes
  848.     % definitions, etc.
  849.     expandafter
  850.   }temp
  851.   popthisfilestack
  852. }
  853. deffilenamecatcodes{%
  854.   catcode`\=other
  855.   catcode`~=other
  856.   catcode`^=other
  857.   catcode`_=other
  858.   catcode`|=other
  859.   catcode`<=other
  860.   catcode`>=other
  861.   catcode`+=other
  862.   catcode`-=other
  863. }
  864. defpushthisfilestack{%
  865.   expandafterpushthisfilestackXpopthisfilestackStackTerm
  866. }
  867. defpushthisfilestackX{%
  868.   expandafterpushthisfilestackYthisfileStackTerm
  869. }
  870. defpushthisfilestackY #1StackTerm #2StackTerm {%
  871.   gdefpopthisfilestack{gdefthisfile{#1}gdefpopthisfilestack{#2}}%
  872. }
  873. defpopthisfilestack{errthisfilestackempty}
  874. deferrthisfilestackempty{errmessage{Internal error:
  875.   the stack of filenames is empty.}}
  876. defthisfile{}
  877. % @center line
  878. % outputs that line, centered.
  879. %
  880. parseargdefcenter{%
  881.   ifhmode
  882.     letnextcenterH
  883.   else
  884.     letnextcenterV
  885.   fi
  886.   next{hfil ignorespaces#1unskip hfil}%
  887. }
  888. defcenterH#1{%
  889.   {%
  890.     hfilbreak
  891.     advancehsize by -leftskip
  892.     advancehsize by -rightskip
  893.     line{#1}%
  894.     break
  895.   }%
  896. }
  897. defcenterV#1{line{kernleftskip #1kernrightskip}}
  898. % @sp n   outputs n lines of vertical space
  899. parseargdefsp{vskip #1baselineskip}
  900. % @comment ...line which is ignored...
  901. % @c is the same as @comment
  902. % @ignore ... @end ignore  is another way to write a comment
  903. defcomment{begingroup catcode`^^M=other%
  904. catcode`@=other catcode`{=other catcode`}=other%
  905. commentxxx}
  906. {catcode`^^M=other gdefcommentxxx#1^^M{endgroup}}
  907. letc=comment
  908. % @paragraphindent NCHARS
  909. % We'll use ems for NCHARS, close enough.
  910. % NCHARS can also be the word `asis' or `none'.
  911. % We cannot feasibly implement @paragraphindent asis, though.
  912. %
  913. defasisword{asis} % no translation, these are keywords
  914. defnoneword{none}
  915. %
  916. parseargdefparagraphindent{%
  917.   deftemp{#1}%
  918.   ifxtempasisword
  919.   else
  920.     ifxtempnoneword
  921.       defaultparindent = 0pt
  922.     else
  923.       defaultparindent = #1em
  924.     fi
  925.   fi
  926.   parindent = defaultparindent
  927. }
  928. % @exampleindent NCHARS
  929. % We'll use ems for NCHARS like @paragraphindent.
  930. % It seems @exampleindent asis isn't necessary, but
  931. % I preserve it to make it similar to @paragraphindent.
  932. parseargdefexampleindent{%
  933.   deftemp{#1}%
  934.   ifxtempasisword
  935.   else
  936.     ifxtempnoneword
  937.       lispnarrowing = 0pt
  938.     else
  939.       lispnarrowing = #1em
  940.     fi
  941.   fi
  942. }
  943. % @firstparagraphindent WORD
  944. % If WORD is `none', then suppress indentation of the first paragraph
  945. % after a section heading.  If WORD is `insert', then do indent at such
  946. % paragraphs.
  947. %
  948. % The paragraph indentation is suppressed or not by calling
  949. % suppressfirstparagraphindent, which the sectioning commands do.
  950. % We switch the definition of this back and forth according to WORD.
  951. % By default, we suppress indentation.
  952. %
  953. defsuppressfirstparagraphindent{dosuppressfirstparagraphindent}
  954. definsertword{insert}
  955. %
  956. parseargdeffirstparagraphindent{%
  957.   deftemp{#1}%
  958.   ifxtempnoneword
  959.     letsuppressfirstparagraphindent = dosuppressfirstparagraphindent
  960.   elseifxtempinsertword
  961.     letsuppressfirstparagraphindent = relax
  962.   else
  963.     errhelp = EMsimple
  964.     errmessage{Unknown @firstparagraphindent option `temp'}%
  965.   fifi
  966. }
  967. % Here is how we actually suppress indentation.  Redefine everypar to
  968. % kern backwards by parindent, and then reset itself to empty.
  969. %
  970. % We also make indent itself not actually do anything until the next
  971. % paragraph.
  972. %
  973. gdefdosuppressfirstparagraphindent{%
  974.   gdefindent{%
  975.     restorefirstparagraphindent
  976.     indent
  977.   }%
  978.   gdefnoindent{%
  979.     restorefirstparagraphindent
  980.     noindent
  981.   }%
  982.   globaleverypar = {%
  983.     kern -parindent
  984.     restorefirstparagraphindent
  985.   }%
  986. }
  987. gdefrestorefirstparagraphindent{%
  988.   global let indent = ptexindent
  989.   global let noindent = ptexnoindent
  990.   global everypar = {}%
  991. }
  992. % @asis just yields its argument.  Used with @table, for example.
  993. %
  994. defasis#1{#1}
  995. % @math outputs its argument in math mode.
  996. %
  997. % One complication: _ usually means subscripts, but it could also mean
  998. % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
  999. % _ active, and distinguish by seeing if the current family is slfam,
  1000. % which is what @var uses.
  1001. {
  1002.   catcode`_ = active
  1003.   gdefmathunderscore{%
  1004.     catcode`_=active
  1005.     def_{ifnumfam=slfam _elsesbfi}%
  1006.   }
  1007. }
  1008. % Another complication: we want \ (and @) to output a  character.
  1009. % FYI, plain.tex uses \ as a temporary control sequence (why?), but
  1010. % this is not advertised and we don't care.  Texinfo does not
  1011. % otherwise define @.
  1012. %
  1013. % The mathchar is class=0=ordinary, family=7=ttfam, position=5C=.
  1014. defmathbackslash{ifnumfam=ttfam mathchar"075C elsebackslash fi}
  1015. %
  1016. defmath{%
  1017.   tex
  1018.   mathunderscore
  1019.   let\ = mathbackslash
  1020.   mathactive
  1021.   % make the texinfo accent commands work in math mode
  1022.   let"=ddot
  1023.   let'=acute
  1024.   let==bar
  1025.   let^=hat
  1026.   let`=grave
  1027.   letu=breve
  1028.   letv=check
  1029.   let~=tilde
  1030.   letdotaccent=dot
  1031.   $finishmath
  1032. }
  1033. deffinishmath#1{#1$endgroup}  % Close the group opened by tex.
  1034. % Some active characters (such as <) are spaced differently in math.
  1035. % We have to reset their definitions in case the @math was an argument
  1036. % to a command which sets the catcodes (such as @item or @section).
  1037. %
  1038. {
  1039.   catcode`^ = active
  1040.   catcode`< = active
  1041.   catcode`> = active
  1042.   catcode`+ = active
  1043.   gdefmathactive{%
  1044.     let^ = ptexhat
  1045.     let< = ptexless
  1046.     let> = ptexgtr
  1047.     let+ = ptexplus
  1048.   }
  1049. }
  1050. % Some math mode symbols.
  1051. defbullet{$ptexbullet$}
  1052. defgeq{ifmmode geelse $ge$fi}
  1053. defleq{ifmmode leelse $le$fi}
  1054. defminus{ifmmode -else $-$fi}
  1055. % @dots{} outputs an ellipsis using the current font.
  1056. % We do .5em per period so that it has the same spacing in the cm
  1057. % typewriter fonts as three actual period characters; on the other hand,
  1058. % in other typewriter fonts three periods are wider than 1.5em.  So do
  1059. % whichever is larger.
  1060. %
  1061. defdots{%
  1062.   leavevmode
  1063.   setbox0=hbox{...}% get width of three periods
  1064.   ifdimwd0 > 1.5em
  1065.     dimen0 = wd0
  1066.   else
  1067.     dimen0 = 1.5em
  1068.   fi
  1069.   hbox to dimen0{%
  1070.     hskip 0pt plus.25fil
  1071.     .hskip 0pt plus1fil
  1072.     .hskip 0pt plus1fil
  1073.     .hskip 0pt plus.5fil
  1074.   }%
  1075. }
  1076. % @enddots{} is an end-of-sentence ellipsis.
  1077. %
  1078. defenddots{%
  1079.   dots
  1080.   spacefactor=endofsentencespacefactor
  1081. }
  1082. % @comma{} is so commas can be inserted into text without messing up
  1083. % Texinfo's parsing.
  1084. %
  1085. letcomma = ,
  1086. % @refill is a no-op.
  1087. letrefill=relax
  1088. % If working on a large document in chapters, it is convenient to
  1089. % be able to disable indexing, cross-referencing, and contents, for test runs.
  1090. % This is done with @novalidate (before @setfilename).
  1091. %
  1092. newififlinks linkstrue % by default we want the aux files.
  1093. letnovalidate = linksfalse
  1094. % @setfilename is done at the beginning of every texinfo file.
  1095. % So open here the files we need to have open while reading the input.
  1096. % This makes it possible to make a .fmt file for texinfo.
  1097. defsetfilename{%
  1098.    fixbackslash  % Turn off hack to swallow `input texinfo'.
  1099.    iflinks
  1100.      tryauxfile
  1101.      % Open the new aux file.  TeX will close it automatically at exit.
  1102.      immediateopenoutauxfile=jobname.aux
  1103.    fi % openindices needs to do some work in any case.
  1104.    openindices
  1105.    letsetfilename=comment % Ignore extra @setfilename cmds.
  1106.    %
  1107.    % If texinfo.cnf is present on the system, read it.
  1108.    % Useful for site-wide @afourpaper, etc.
  1109.    openin 1 texinfo.cnf
  1110.    ifeof 1 else input texinfo.cnf fi
  1111.    closein 1
  1112.    %
  1113.    comment % Ignore the actual filename.
  1114. }
  1115. % Called from setfilename.
  1116. %
  1117. defopenindices{%
  1118.   newindex{cp}%
  1119.   newcodeindex{fn}%
  1120.   newcodeindex{vr}%
  1121.   newcodeindex{tp}%
  1122.   newcodeindex{ky}%
  1123.   newcodeindex{pg}%
  1124. }
  1125. % @bye.
  1126. outerdefbye{pagealignmacrotracingstats=1ptexend}
  1127. message{pdf,}
  1128. % adobe `portable' document format
  1129. newcounttempnum
  1130. newcountlnkcount
  1131. newtoksfilename
  1132. newcountfilenamelength
  1133. newcountpgn
  1134. newtokstoksA
  1135. newtokstoksB
  1136. newtokstoksC
  1137. newtokstoksD
  1138. newboxboxA
  1139. newcountcountA
  1140. newififpdf
  1141. newififpdfmakepagedest
  1142. % when pdftex is run in dvi mode, pdfoutput is defined (so pdfoutput=1
  1143. % can be set).  So we test for relax and 0 as well as undefined,
  1144. % borrowed from ifpdf.sty.
  1145. ifxpdfoutputundefined
  1146. else
  1147.   ifxpdfoutputrelax
  1148.   else
  1149.     ifcasepdfoutput
  1150.     else
  1151.       pdftrue
  1152.     fi
  1153.   fi
  1154. fi
  1155. % PDF uses PostScript string constants for the names of xref targets,
  1156. % for display in the outlines, and in other places.  Thus, we have to
  1157. % double any backslashes.  Otherwise, a name like "node" will be
  1158. % interpreted as a newline (n), followed by o, d, e.  Not good.
  1159. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
  1160. % (and related messages, the final outcome is that it is up to the TeX
  1161. % user to double the backslashes and otherwise make the string valid, so
  1162. % that's what we do).
  1163. % double active backslashes.
  1164. {catcode`@=0 catcode`\=active
  1165.  @gdef@activebackslashdouble{%
  1166.    @catcode`@=@active
  1167.    @let=@doublebackslash}
  1168. }
  1169. % To handle parens, we must adopt a different approach, since parens are
  1170. % not active characters.  hyperref.dtx (which has the same problem as
  1171. % us) handles it with this amazing macro to replace tokens, with minor
  1172. % changes for Texinfo.  It is included here under the GPL by permission
  1173. % from the author, Heiko Oberdiek.
  1174. % #1 is the tokens to replace.
  1175. % #2 is the replacement.
  1176. % #3 is the control sequence with the string.
  1177. defHyPsdSubst#1#2#3{%
  1178.   defHyPsdReplace##1#1##2END{%
  1179.     ##1%
  1180.     ifx\##2\%
  1181.     else
  1182.       #2%
  1183.       HyReturnAfterFi{%
  1184.         HyPsdReplace##2END
  1185.       }%
  1186.     fi
  1187.   }%
  1188.   xdef#3{expandafterHyPsdReplace#3#1END}%
  1189. }
  1190. longdefHyReturnAfterFi#1fi{fi#1}
  1191. % #1 is a control sequence in which to do the replacements.
  1192. defbackslashparens#1{%
  1193.   xdef#1{#1}% redefine it as its expansion; the definition is simply
  1194.              % lastnode when called from setref -> pdfmkdest.
  1195.   HyPsdSubst{(}{realbackslash(}{#1}%
  1196.   HyPsdSubst{)}{realbackslash)}{#1}%
  1197. }
  1198. newhelpnopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
  1199. with PDF output, and none of those formats could be found.  (.eps cannot
  1200. be supported due to the design of the PDF format; use regular TeX (DVI
  1201. output) for that.)}
  1202. ifpdf
  1203.   %
  1204.   % Color manipulation macros based on pdfcolor.tex.
  1205.   defcmykDarkRed{0.28 1 1 0.35}
  1206.   defcmykBlack{0 0 0 1}
  1207.   %
  1208.   defpdfsetcolor#1{pdfliteral{#1 k}}
  1209.   % Set color, and create a mark which defines thiscolor accordingly,
  1210.   % so that makeheadline knows which color to restore.
  1211.   defsetcolor#1{%
  1212.     xdeflastcolordefs{gdefnoexpandthiscolor{#1}}%
  1213.     domark
  1214.     pdfsetcolor{#1}%
  1215.   }
  1216.   %
  1217.   defmaincolor{cmykBlack}
  1218.   pdfsetcolor{maincolor}
  1219.   edefthiscolor{maincolor}
  1220.   deflastcolordefs{}
  1221.   %
  1222.   defmakefootline{%
  1223.     baselineskip24pt
  1224.     line{pdfsetcolor{maincolor}thefootline}%
  1225.   }
  1226.   %
  1227.   defmakeheadline{%
  1228.     vbox to 0pt{%
  1229.       vskip-22.5pt
  1230.       line{%
  1231.         vbox to8.5pt{}%
  1232.         % Extract thiscolor definition from the marks.
  1233.         getcolormarks
  1234.         % Typeset the headline with maincolor, then restore the color.
  1235.         pdfsetcolor{maincolor}theheadlinepdfsetcolor{thiscolor}%
  1236.       }%
  1237.       vss
  1238.     }%
  1239.     nointerlineskip
  1240.   }
  1241.   %
  1242.   %
  1243.   pdfcatalog{/PageMode /UseOutlines}
  1244.   %
  1245.   % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
  1246.   defdopdfimage#1#2#3{%
  1247.     defimagewidth{#2}setbox0 = hbox{ignorespaces #2}%
  1248.     defimageheight{#3}setbox2 = hbox{ignorespaces #3}%
  1249.     %
  1250.     % pdftex (and the PDF format) support .png, .jpg, .pdf (among
  1251.     % others).  Let's try in that order.
  1252.     letpdfimgext=empty
  1253.     begingroup
  1254.       openin 1 #1.png ifeof 1
  1255.         openin 1 #1.jpg ifeof 1
  1256.           openin 1 #1.jpeg ifeof 1
  1257.             openin 1 #1.JPG ifeof 1
  1258.               openin 1 #1.pdf ifeof 1
  1259.                 openin 1 #1.PDF ifeof 1
  1260.                   errhelp = nopdfimagehelp
  1261.                   errmessage{Could not find image file #1 for pdf}%
  1262.                 else gdefpdfimgext{PDF}%
  1263.                 fi
  1264.               else gdefpdfimgext{pdf}%
  1265.               fi
  1266.             else gdefpdfimgext{JPG}%
  1267.             fi
  1268.           else gdefpdfimgext{jpeg}%
  1269.           fi
  1270.         else gdefpdfimgext{jpg}%
  1271.         fi
  1272.       else gdefpdfimgext{png}%
  1273.       fi
  1274.       closein 1
  1275.     endgroup
  1276.     %
  1277.     % without immediate, ancient pdftex seg faults when the same image is
  1278.     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
  1279.     ifnumpdftexversion < 14
  1280.       immediatepdfimage
  1281.     else
  1282.       immediatepdfximage
  1283.     fi
  1284.       ifdim wd0 >0pt width imagewidth fi
  1285.       ifdim wd2 >0pt height imageheight fi
  1286.       ifnumpdftexversion<13
  1287.          #1.pdfimgext
  1288.        else
  1289.          {#1.pdfimgext}%
  1290.        fi
  1291.     ifnumpdftexversion < 14 else
  1292.       pdfrefximage pdflastximage
  1293.     fi}
  1294.   %
  1295.   defpdfmkdest#1{{%
  1296.     % We have to set dummies so commands such as @code, and characters
  1297.     % such as , aren't expanded when present in a section title.
  1298.     indexnofonts
  1299.     turnoffactive
  1300.     activebackslashdouble
  1301.     makevalueexpandable
  1302.     defpdfdestname{#1}%
  1303.     backslashparenspdfdestname
  1304.     safewhatsit{pdfdest name{pdfdestname} xyz}%
  1305.   }}
  1306.   %
  1307.   % used to mark target names; must be expandable.
  1308.   defpdfmkpgn#1{#1}
  1309.   %
  1310.   % by default, use a color that is dark enough to print on paper as
  1311.   % nearly black, but still distinguishable for online viewing.
  1312.   defurlcolor{cmykDarkRed}
  1313.   deflinkcolor{cmykDarkRed}
  1314.   defendlink{setcolor{maincolor}pdfendlink}
  1315.   %
  1316.   % Adding outlines to PDF; macros for calculating structure of outlines
  1317.   % come from Petr Olsak
  1318.   defexpnumber#1{expandafterifxcsname#1endcsnamerelax 0%
  1319.     else csname#1endcsname fi}
  1320.   defadvancenumber#1{tempnum=expnumber{#1}relax
  1321.     advancetempnum by 1
  1322.     expandafterxdefcsname#1endcsname{thetempnum}}
  1323.   %
  1324.   % #1 is the section text, which is what will be displayed in the
  1325.   % outline by the pdf viewer.  #2 is the pdf expression for the number
  1326.   % of subentries (or empty, for subsubsections).  #3 is the node text,
  1327.   % which might be empty if this toc entry had no corresponding node.
  1328.   % #4 is the page number
  1329.   %
  1330.   defdopdfoutline#1#2#3#4{%
  1331.     % Generate a link to the node text if that exists; else, use the
  1332.     % page number.  We could generate a destination for the section
  1333.     % text in the case where a section has no node, but it doesn't
  1334.     % seem worth the trouble, since most documents are normally structured.
  1335.     defpdfoutlinedest{#3}%
  1336.     ifxpdfoutlinedestempty
  1337.       defpdfoutlinedest{#4}%
  1338.     else
  1339.       % Doubled backslashes in the name.
  1340.       {activebackslashdouble xdefpdfoutlinedest{#3}%
  1341.        backslashparenspdfoutlinedest}%
  1342.     fi
  1343.     %
  1344.     % Also double the backslashes in the display string.
  1345.     {activebackslashdouble xdefpdfoutlinetext{#1}%
  1346.      backslashparenspdfoutlinetext}%
  1347.     %
  1348.     pdfoutline goto name{pdfmkpgn{pdfoutlinedest}}#2{pdfoutlinetext}%
  1349.   }
  1350.   %
  1351.   defpdfmakeoutlines{%
  1352.     begingroup
  1353.       % Thanh's hack / proper braces in bookmarks
  1354.       edefmylbrace{iftrue string{else}fi}let{=mylbrace
  1355.       edefmyrbrace{iffalse{elsestring}fi}let}=myrbrace
  1356.       %
  1357.       % Read toc silently, to get counts of subentries for pdfoutline.
  1358.       defnumchapentry##1##2##3##4{%
  1359. defthischapnum{##2}%
  1360. defthissecnum{0}%
  1361. defthissubsecnum{0}%
  1362.       }%
  1363.       defnumsecentry##1##2##3##4{%
  1364. advancenumber{chapthischapnum}%
  1365. defthissecnum{##2}%
  1366. defthissubsecnum{0}%
  1367.       }%
  1368.       defnumsubsecentry##1##2##3##4{%
  1369. advancenumber{secthissecnum}%
  1370. defthissubsecnum{##2}%
  1371.       }%
  1372.       defnumsubsubsecentry##1##2##3##4{%
  1373. advancenumber{subsecthissubsecnum}%
  1374.       }%
  1375.       defthischapnum{0}%
  1376.       defthissecnum{0}%
  1377.       defthissubsecnum{0}%
  1378.       %
  1379.       % use def rather than let here because we redefine chapentry et
  1380.       % al. a second time, below.
  1381.       defappentry{numchapentry}%
  1382.       defappsecentry{numsecentry}%
  1383.       defappsubsecentry{numsubsecentry}%
  1384.       defappsubsubsecentry{numsubsubsecentry}%
  1385.       defunnchapentry{numchapentry}%
  1386.       defunnsecentry{numsecentry}%
  1387.       defunnsubsecentry{numsubsecentry}%
  1388.       defunnsubsubsecentry{numsubsubsecentry}%
  1389.       readdatafile{toc}%
  1390.       %
  1391.       % Read toc second time, this time actually producing the outlines.
  1392.       % The `-' means take the expnumber as the absolute number of
  1393.       % subentries, which we calculated on our first read of the .toc above.
  1394.       %
  1395.       % We use the node names as the destinations.
  1396.       defnumchapentry##1##2##3##4{%
  1397.         dopdfoutline{##1}{count-expnumber{chap##2}}{##3}{##4}}%
  1398.       defnumsecentry##1##2##3##4{%
  1399.         dopdfoutline{##1}{count-expnumber{sec##2}}{##3}{##4}}%
  1400.       defnumsubsecentry##1##2##3##4{%
  1401.         dopdfoutline{##1}{count-expnumber{subsec##2}}{##3}{##4}}%
  1402.       defnumsubsubsecentry##1##2##3##4{% count is always zero
  1403.         dopdfoutline{##1}{}{##3}{##4}}%
  1404.       %
  1405.       % PDF outlines are displayed using system fonts, instead of
  1406.       % document fonts.  Therefore we cannot use special characters,
  1407.       % since the encoding is unknown.  For example, the eogonek from
  1408.       % Latin 2 (0xea) gets translated to a | character.  Info from
  1409.       % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
  1410.       %
  1411.       % xx to do this right, we have to translate 8-bit characters to
  1412.       % their "best" equivalent, based on the @documentencoding.  Right
  1413.       % now, I guess we'll just let the pdf reader have its way.
  1414.       indexnofonts
  1415.       setupdatafile
  1416.       catcode`\=active otherbackslash
  1417.       input tocreadfilename
  1418.     endgroup
  1419.   }
  1420.   %
  1421.   defskipspaces#1{defPP{#1}defD{|}%
  1422.     ifxPPDletnextsprelax
  1423.     elseletnextspskipspaces
  1424.       ifxpspaceelseaddtokens{filename}{PP}%
  1425.         advancefilenamelength by 1
  1426.       fi
  1427.     fi
  1428.     nextsp}
  1429.   defgetfilename#1{filenamelength=0expandafterskipspaces#1|relax}
  1430.   ifnumpdftexversion < 14
  1431.     let startlink pdfannotlink
  1432.   else
  1433.     let startlink pdfstartlink
  1434.   fi
  1435.   % make a live url in pdf output.
  1436.   defpdfurl#1{%
  1437.     begingroup
  1438.       % it seems we really need yet another set of dummies; have not
  1439.       % tried to figure out what each command should do in the context
  1440.       % of @url.  for now, just make @/ a no-op, that's the only one
  1441.       % people have actually reported a problem with.
  1442.       % 
  1443.       normalturnoffactive
  1444.       def@{@}%
  1445.       let/=empty
  1446.       makevalueexpandable
  1447.       leavevmodesetcolor{urlcolor}%
  1448.       startlink attr{/Border [0 0 0]}%
  1449.         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
  1450.     endgroup}
  1451.   defpdfgettoks#1.{setboxboxA=hbox{toksA={#1.}toksB={}maketoks}}
  1452.   defaddtokens#1#2{edefaddtoks{noexpand#1={the#1#2}}addtoks}
  1453.   defadn#1{addtokens{toksC}{#1}globalcountA=1letnext=maketoks}
  1454.   defpoptoks#1#2|ENDTOKS|{letfirst=#1toksD={#1}toksA={#2}}
  1455.   defmaketoks{%
  1456.     expandafterpoptoksthetoksA|ENDTOKS|relax
  1457.     ifxfirst0adn0
  1458.     elseifxfirst1adn1 elseifxfirst2adn2 elseifxfirst3adn3
  1459.     elseifxfirst4adn4 elseifxfirst5adn5 elseifxfirst6adn6
  1460.     elseifxfirst7adn7 elseifxfirst8adn8 elseifxfirst9adn9
  1461.     else
  1462.       ifnum0=countAelsemakelinkfi
  1463.       ifxfirst.letnext=doneelse
  1464.         letnext=maketoks
  1465.         addtokens{toksB}{thetoksD}
  1466.         ifxfirst,addtokens{toksB}{space}fi
  1467.       fi
  1468.     fifififififififififi
  1469.     next}
  1470.   defmakelink{addtokens{toksB}%
  1471.     {noexpandpdflink{thetoksC}}toksC={}globalcountA=0}
  1472.   defpdflink#1{%
  1473.     startlink attr{/Border [0 0 0]} goto name{pdfmkpgn{#1}}
  1474.     setcolor{linkcolor}#1endlink}
  1475.   defdone{edefst{globalnoexpandtoksA={thetoksB}}st}
  1476. else
  1477.   letpdfmkdest = gobble
  1478.   letpdfurl = gobble
  1479.   letendlink = relax
  1480.   letsetcolor = gobble
  1481.   letpdfsetcolor = gobble
  1482.   letpdfmakeoutlines = relax
  1483. fi  % ifxpdfoutput
  1484. message{fonts,}
  1485. % Change the current font style to #1, remembering it in curfontstyle.
  1486. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
  1487. % italics, not bold italics.
  1488. %
  1489. defsetfontstyle#1{%
  1490.   defcurfontstyle{#1}% not as a control sequence, because we are edef'd.
  1491.   csname ten#1endcsname  % change the current font
  1492. }
  1493. % Select #1 fonts with the current style.
  1494. %
  1495. defselectfonts#1{csname #1fontsendcsname csnamecurfontstyleendcsname}
  1496. defrm{fam=0 setfontstyle{rm}}
  1497. defit{fam=itfam setfontstyle{it}}
  1498. defsl{fam=slfam setfontstyle{sl}}
  1499. defbf{fam=bffam setfontstyle{bf}}defbfstylename{bf}
  1500. deftt{fam=ttfam setfontstyle{tt}}
  1501. % Texinfo sort of supports the sans serif font style, which plain TeX does not.
  1502. % So we set up a sf.
  1503. newfamsffam
  1504. defsf{fam=sffam setfontstyle{sf}}
  1505. letli = sf % Sometimes we call it li, not sf.
  1506. % We don't need math for this font style.
  1507. defttsl{setfontstyle{ttsl}}
  1508. % Default leading.
  1509. newdimentextleading  textleading = 13.2pt
  1510. % Set the baselineskip to #1, and the lineskip and strut size
  1511. % correspondingly.  There is no deep meaning behind these magic numbers
  1512. % used as factors; they just match (closely enough) what Knuth defined.
  1513. %
  1514. deflineskipfactor{.08333}
  1515. defstrutheightpercent{.70833}
  1516. defstrutdepthpercent {.29167}
  1517. %
  1518. % can get a sort of poor man's double spacing by redefining this.
  1519. defbaselinefactor{1}
  1520. %
  1521. defsetleading#1{%
  1522.   dimen0 = #1relax
  1523.   normalbaselineskip = baselinefactordimen0
  1524.   normallineskip = lineskipfactornormalbaselineskip
  1525.   normalbaselines
  1526.   setboxstrutbox =hbox{%
  1527.     vrule width0pt heightstrutheightpercentbaselineskip
  1528.                     depth strutdepthpercent baselineskip
  1529.   }%
  1530. }
  1531. % PDF CMaps.  See also LaTeX's t1.cmap.
  1532. %
  1533. % do nothing with this by default.
  1534. expandafterletcsname cmapOT1endcsnamegobble
  1535. expandafterletcsname cmapOT1ITendcsnamegobble
  1536. expandafterletcsname cmapOT1TTendcsnamegobble
  1537. % if we are producing pdf, and we have pdffontattr, then define cmaps.
  1538. % (pdffontattr was introduced many years ago, but people still run
  1539. % older pdftex's; it's easy to conditionalize, so we do.)
  1540. ifpdf ifxpdffontattrundefined else
  1541.   begingroup
  1542.     catcode`^^M=active def^^M{^^J}% Output line endings as the ^^J char.
  1543.     catcode`%=12 immediatepdfobj stream {%!PS-Adobe-3.0 Resource-CMap
  1544. %%DocumentNeededResources: ProcSet (CIDInit)
  1545. %%IncludeResource: ProcSet (CIDInit)
  1546. %%BeginResource: CMap (TeX-OT1-0)
  1547. %%Title: (TeX-OT1-0 TeX OT1 0)
  1548. %%Version: 1.000
  1549. %%EndComments
  1550. /CIDInit /ProcSet findresource begin
  1551. 12 dict begin
  1552. begincmap
  1553. /CIDSystemInfo
  1554. << /Registry (TeX)
  1555. /Ordering (OT1)
  1556. /Supplement 0
  1557. >> def
  1558. /CMapName /TeX-OT1-0 def
  1559. /CMapType 2 def
  1560. 1 begincodespacerange
  1561. <00> <7F>
  1562. endcodespacerange
  1563. 8 beginbfrange
  1564. <00> <01> <0393>
  1565. <09> <0A> <03A8>
  1566. <23> <26> <0023>
  1567. <28> <3B> <0028>
  1568. <3F> <5B> <003F>
  1569. <5D> <5E> <005D>
  1570. <61> <7A> <0061>
  1571. <7B> <7C> <2013>
  1572. endbfrange
  1573. 40 beginbfchar
  1574. <02> <0398>
  1575. <03> <039B>
  1576. <04> <039E>
  1577. <05> <03A0>
  1578. <06> <03A3>
  1579. <07> <03D2>
  1580. <08> <03A6>
  1581. <0B> <00660066>
  1582. <0C> <00660069>
  1583. <0D> <0066006C>
  1584. <0E> <006600660069>
  1585. <0F> <00660066006C>
  1586. <10> <0131>
  1587. <11> <0237>
  1588. <12> <0060>
  1589. <13> <00B4>
  1590. <14> <02C7>
  1591. <15> <02D8>
  1592. <16> <00AF>
  1593. <17> <02DA>
  1594. <18> <00B8>
  1595. <19> <00DF>
  1596. <1A> <00E6>
  1597. <1B> <0153>
  1598. <1C> <00F8>
  1599. <1D> <00C6>
  1600. <1E> <0152>
  1601. <1F> <00D8>
  1602. <21> <0021>
  1603. <22> <201D>
  1604. <27> <2019>
  1605. <3C> <00A1>
  1606. <3D> <003D>
  1607. <3E> <00BF>
  1608. <5C> <201C>
  1609. <5F> <02D9>
  1610. <60> <2018>
  1611. <7D> <02DD>
  1612. <7E> <007E>
  1613. <7F> <00A8>
  1614. endbfchar
  1615. endcmap
  1616. CMapName currentdict /CMap defineresource pop
  1617. end
  1618. end
  1619. %%EndResource
  1620. %%EOF
  1621.     }endgroup
  1622.   expandafteredefcsname cmapOT1endcsname#1{%
  1623.     pdffontattr#1{/ToUnicode thepdflastobjspace 0 R}%
  1624.   }%
  1625. %
  1626. % cmapOT1IT
  1627.   begingroup
  1628.     catcode`^^M=active def^^M{^^J}% Output line endings as the ^^J char.
  1629.     catcode`%=12 immediatepdfobj stream {%!PS-Adobe-3.0 Resource-CMap
  1630. %%DocumentNeededResources: ProcSet (CIDInit)
  1631. %%IncludeResource: ProcSet (CIDInit)
  1632. %%BeginResource: CMap (TeX-OT1IT-0)
  1633. %%Title: (TeX-OT1IT-0 TeX OT1IT 0)
  1634. %%Version: 1.000
  1635. %%EndComments
  1636. /CIDInit /ProcSet findresource begin
  1637. 12 dict begin
  1638. begincmap
  1639. /CIDSystemInfo
  1640. << /Registry (TeX)
  1641. /Ordering (OT1IT)
  1642. /Supplement 0
  1643. >> def
  1644. /CMapName /TeX-OT1IT-0 def
  1645. /CMapType 2 def
  1646. 1 begincodespacerange
  1647. <00> <7F>
  1648. endcodespacerange
  1649. 8 beginbfrange
  1650. <00> <01> <0393>
  1651. <09> <0A> <03A8>
  1652. <25> <26> <0025>
  1653. <28> <3B> <0028>
  1654. <3F> <5B> <003F>
  1655. <5D> <5E> <005D>
  1656. <61> <7A> <0061>
  1657. <7B> <7C> <2013>
  1658. endbfrange
  1659. 42 beginbfchar
  1660. <02> <0398>
  1661. <03> <039B>
  1662. <04> <039E>
  1663. <05> <03A0>
  1664. <06> <03A3>
  1665. <07> <03D2>
  1666. <08> <03A6>
  1667. <0B> <00660066>
  1668. <0C> <00660069>
  1669. <0D> <0066006C>
  1670. <0E> <006600660069>
  1671. <0F> <00660066006C>
  1672. <10> <0131>
  1673. <11> <0237>
  1674. <12> <0060>
  1675. <13> <00B4>
  1676. <14> <02C7>
  1677. <15> <02D8>
  1678. <16> <00AF>
  1679. <17> <02DA>
  1680. <18> <00B8>
  1681. <19> <00DF>
  1682. <1A> <00E6>
  1683. <1B> <0153>
  1684. <1C> <00F8>
  1685. <1D> <00C6>
  1686. <1E> <0152>
  1687. <1F> <00D8>
  1688. <21> <0021>
  1689. <22> <201D>
  1690. <23> <0023>
  1691. <24> <00A3>
  1692. <27> <2019>
  1693. <3C> <00A1>
  1694. <3D> <003D>
  1695. <3E> <00BF>
  1696. <5C> <201C>
  1697. <5F> <02D9>
  1698. <60> <2018>
  1699. <7D> <02DD>
  1700. <7E> <007E>
  1701. <7F> <00A8>
  1702. endbfchar
  1703. endcmap
  1704. CMapName currentdict /CMap defineresource pop
  1705. end
  1706. end
  1707. %%EndResource
  1708. %%EOF
  1709.     }endgroup
  1710.   expandafteredefcsname cmapOT1ITendcsname#1{%
  1711.     pdffontattr#1{/ToUnicode thepdflastobjspace 0 R}%
  1712.   }%
  1713. %
  1714. % cmapOT1TT
  1715.   begingroup
  1716.     catcode`^^M=active def^^M{^^J}% Output line endings as the ^^J char.
  1717.     catcode`%=12 immediatepdfobj stream {%!PS-Adobe-3.0 Resource-CMap
  1718. %%DocumentNeededResources: ProcSet (CIDInit)
  1719. %%IncludeResource: ProcSet (CIDInit)
  1720. %%BeginResource: CMap (TeX-OT1TT-0)
  1721. %%Title: (TeX-OT1TT-0 TeX OT1TT 0)
  1722. %%Version: 1.000
  1723. %%EndComments
  1724. /CIDInit /ProcSet findresource begin
  1725. 12 dict begin
  1726. begincmap
  1727. /CIDSystemInfo
  1728. << /Registry (TeX)
  1729. /Ordering (OT1TT)
  1730. /Supplement 0
  1731. >> def
  1732. /CMapName /TeX-OT1TT-0 def
  1733. /CMapType 2 def
  1734. 1 begincodespacerange
  1735. <00> <7F>
  1736. endcodespacerange
  1737. 5 beginbfrange
  1738. <00> <01> <0393>
  1739. <09> <0A> <03A8>
  1740. <21> <26> <0021>
  1741. <28> <5F> <0028>
  1742. <61> <7E> <0061>
  1743. endbfrange
  1744. 32 beginbfchar
  1745. <02> <0398>
  1746. <03> <039B>
  1747. <04> <039E>
  1748. <05> <03A0>
  1749. <06> <03A3>
  1750. <07> <03D2>
  1751. <08> <03A6>
  1752. <0B> <2191>
  1753. <0C> <2193>
  1754. <0D> <0027>
  1755. <0E> <00A1>
  1756. <0F> <00BF>
  1757. <10> <0131>
  1758. <11> <0237>
  1759. <12> <0060>
  1760. <13> <00B4>
  1761. <14> <02C7>
  1762. <15> <02D8>
  1763. <16> <00AF>
  1764. <17> <02DA>
  1765. <18> <00B8>
  1766. <19> <00DF>
  1767. <1A> <00E6>
  1768. <1B> <0153>
  1769. <1C> <00F8>
  1770. <1D> <00C6>
  1771. <1E> <0152>
  1772. <1F> <00D8>
  1773. <20> <2423>
  1774. <27> <2019>
  1775. <60> <2018>
  1776. <7F> <00A8>
  1777. endbfchar
  1778. endcmap
  1779. CMapName currentdict /CMap defineresource pop
  1780. end
  1781. end
  1782. %%EndResource
  1783. %%EOF
  1784.     }endgroup
  1785.   expandafteredefcsname cmapOT1TTendcsname#1{%
  1786.     pdffontattr#1{/ToUnicode thepdflastobjspace 0 R}%
  1787.   }%
  1788. fifi
  1789. % Set the font macro #1 to the font named #2, adding on the
  1790. % specified font prefix (normally `cm').
  1791. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap
  1792. % encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
  1793. % empty to omit).
  1794. defsetfont#1#2#3#4#5{%
  1795.   font#1=fontprefix#2#3 scaled #4
  1796.   csname cmap#5endcsname#1%
  1797. }
  1798. % This is what gets called when #5 of setfont is empty.
  1799. letcmapgobble
  1800. % emacs-page end of cmaps
  1801. % Use cm as the default font prefix.
  1802. % To specify the font prefix, you must define fontprefix
  1803. % before you read in texinfo.tex.
  1804. ifxfontprefixundefined
  1805. deffontprefix{cm}
  1806. fi
  1807. % Support font families that don't use the same naming scheme as CM.
  1808. defrmshape{r}
  1809. defrmbshape{bx}               %where the normal face is bold
  1810. defbfshape{b}
  1811. defbxshape{bx}
  1812. defttshape{tt}
  1813. defttbshape{tt}
  1814. defttslshape{sltt}
  1815. defitshape{ti}
  1816. defitbshape{bxti}
  1817. defslshape{sl}
  1818. defslbshape{bxsl}
  1819. defsfshape{ss}
  1820. defsfbshape{ss}
  1821. defscshape{csc}
  1822. defscbshape{csc}
  1823. % Definitions for a main text size of 11pt.  This is the default in
  1824. % Texinfo.
  1825. defdefinetextfontsizexi{%
  1826. % Text fonts (11.2pt, magstep1).
  1827. deftextnominalsize{11pt}
  1828. edefmainmagstep{magstephalf}
  1829. setfonttextrmrmshape{10}{mainmagstep}{OT1}
  1830. setfonttextttttshape{10}{mainmagstep}{OT1TT}
  1831. setfonttextbfbfshape{10}{mainmagstep}{OT1}
  1832. setfonttextititshape{10}{mainmagstep}{OT1IT}
  1833. setfonttextslslshape{10}{mainmagstep}{OT1}
  1834. setfonttextsfsfshape{10}{mainmagstep}{OT1}
  1835. setfonttextscscshape{10}{mainmagstep}{OT1}
  1836. setfonttextttslttslshape{10}{mainmagstep}{OT1TT}
  1837. fonttexti=cmmi10 scaled mainmagstep
  1838. fonttextsy=cmsy10 scaled mainmagstep
  1839. deftextecsize{1095}
  1840. % A few fonts for @defun names and args.
  1841. setfontdefbfbfshape{10}{magstep1}{OT1}
  1842. setfontdefttttshape{10}{magstep1}{OT1TT}
  1843. setfontdefttslttslshape{10}{magstep1}{OT1TT}
  1844. defdf{lettentt=deftt lettenbf = defbf lettenttsl=defttsl bf}
  1845. % Fonts for indices, footnotes, small examples (9pt).
  1846. defsmallnominalsize{9pt}
  1847. setfontsmallrmrmshape{9}{1000}{OT1}
  1848. setfontsmallttttshape{9}{1000}{OT1TT}
  1849. setfontsmallbfbfshape{10}{900}{OT1}
  1850. setfontsmallititshape{9}{1000}{OT1IT}
  1851. setfontsmallslslshape{9}{1000}{OT1}
  1852. setfontsmallsfsfshape{9}{1000}{OT1}
  1853. setfontsmallscscshape{10}{900}{OT1}
  1854. setfontsmallttslttslshape{10}{900}{OT1TT}
  1855. fontsmalli=cmmi9
  1856. fontsmallsy=cmsy9
  1857. defsmallecsize{0900}
  1858. % Fonts for small examples (8pt).
  1859. defsmallernominalsize{8pt}
  1860. setfontsmallerrmrmshape{8}{1000}{OT1}
  1861. setfontsmallerttttshape{8}{1000}{OT1TT}
  1862. setfontsmallerbfbfshape{10}{800}{OT1}
  1863. setfontsmallerititshape{8}{1000}{OT1IT}
  1864. setfontsmallerslslshape{8}{1000}{OT1}
  1865. setfontsmallersfsfshape{8}{1000}{OT1}
  1866. setfontsmallerscscshape{10}{800}{OT1}
  1867. setfontsmallerttslttslshape{10}{800}{OT1TT}
  1868. fontsmalleri=cmmi8
  1869. fontsmallersy=cmsy8
  1870. defsmallerecsize{0800}
  1871. % Fonts for title page (20.4pt):
  1872. deftitlenominalsize{20pt}
  1873. setfonttitlermrmbshape{12}{magstep3}{OT1}
  1874. setfonttitleititbshape{10}{magstep4}{OT1IT}
  1875. setfonttitleslslbshape{10}{magstep4}{OT1}
  1876. setfonttitlettttbshape{12}{magstep3}{OT1TT}
  1877. setfonttitlettslttslshape{10}{magstep4}{OT1TT}
  1878. setfonttitlesfsfbshape{17}{magstep1}{OT1}
  1879. lettitlebf=titlerm
  1880. setfonttitlescscbshape{10}{magstep4}{OT1}
  1881. fonttitlei=cmmi12 scaled magstep3
  1882. fonttitlesy=cmsy10 scaled magstep4
  1883. defauthorrm{secrm}
  1884. defauthortt{sectt}
  1885. deftitleecsize{2074}
  1886. % Chapter (and unnumbered) fonts (17.28pt).
  1887. defchapnominalsize{17pt}
  1888. setfontchaprmrmbshape{12}{magstep2}{OT1}
  1889. setfontchapititbshape{10}{magstep3}{OT1IT}
  1890. setfontchapslslbshape{10}{magstep3}{OT1}
  1891. setfontchapttttbshape{12}{magstep2}{OT1TT}
  1892. setfontchapttslttslshape{10}{magstep3}{OT1TT}
  1893. setfontchapsfsfbshape{17}{1000}{OT1}
  1894. letchapbf=chaprm
  1895. setfontchapscscbshape{10}{magstep3}{OT1}
  1896. fontchapi=cmmi12 scaled magstep2
  1897. fontchapsy=cmsy10 scaled magstep3
  1898. defchapecsize{1728}
  1899. % Section fonts (14.4pt).
  1900. defsecnominalsize{14pt}
  1901. setfontsecrmrmbshape{12}{magstep1}{OT1}
  1902. setfontsecititbshape{10}{magstep2}{OT1IT}
  1903. setfontsecslslbshape{10}{magstep2}{OT1}
  1904. setfontsecttttbshape{12}{magstep1}{OT1TT}
  1905. setfontsecttslttslshape{10}{magstep2}{OT1TT}
  1906. setfontsecsfsfbshape{12}{magstep1}{OT1}
  1907. letsecbfsecrm
  1908. setfontsecscscbshape{10}{magstep2}{OT1}
  1909. fontseci=cmmi12 scaled magstep1
  1910. fontsecsy=cmsy10 scaled magstep2
  1911. defsececsize{1440}
  1912. % Subsection fonts (13.15pt).
  1913. defssecnominalsize{13pt}
  1914. setfontssecrmrmbshape{12}{magstephalf}{OT1}
  1915. setfontssecititbshape{10}{1315}{OT1IT}
  1916. setfontssecslslbshape{10}{1315}{OT1}
  1917. setfontssecttttbshape{12}{magstephalf}{OT1TT}
  1918. setfontssecttslttslshape{10}{1315}{OT1TT}
  1919. setfontssecsfsfbshape{12}{magstephalf}{OT1}
  1920. letssecbfssecrm
  1921. setfontssecscscbshape{10}{1315}{OT1}
  1922. fontsseci=cmmi12 scaled magstephalf
  1923. fontssecsy=cmsy10 scaled 1315
  1924. defssececsize{1200}
  1925. % Reduced fonts for @acro in text (10pt).
  1926. defreducednominalsize{10pt}
  1927. setfontreducedrmrmshape{10}{1000}{OT1}
  1928. setfontreducedttttshape{10}{1000}{OT1TT}
  1929. setfontreducedbfbfshape{10}{1000}{OT1}
  1930. setfontreducedititshape{10}{1000}{OT1IT}
  1931. setfontreducedslslshape{10}{1000}{OT1}
  1932. setfontreducedsfsfshape{10}{1000}{OT1}
  1933. setfontreducedscscshape{10}{1000}{OT1}
  1934. setfontreducedttslttslshape{10}{1000}{OT1TT}
  1935. fontreducedi=cmmi10
  1936. fontreducedsy=cmsy10
  1937. defreducedecsize{1000}
  1938. % reset the current fonts
  1939. textfonts
  1940. rm
  1941. } % end of 11pt text font size definitions
  1942. % Definitions to make the main text be 10pt Computer Modern, with
  1943. % section, chapter, etc., sizes following suit.  This is for the GNU
  1944. % Press printing of the Emacs 22 manual.  Maybe other manuals in the
  1945. % future.  Used with @smallbook, which sets the leading to 12pt.
  1946. defdefinetextfontsizex{%
  1947. % Text fonts (10pt).
  1948. deftextnominalsize{10pt}
  1949. edefmainmagstep{1000}
  1950. setfonttextrmrmshape{10}{mainmagstep}{OT1}
  1951. setfonttextttttshape{10}{mainmagstep}{OT1TT}
  1952. setfonttextbfbfshape{10}{mainmagstep}{OT1}
  1953. setfonttextititshape{10}{mainmagstep}{OT1IT}
  1954. setfonttextslslshape{10}{mainmagstep}{OT1}
  1955. setfonttextsfsfshape{10}{mainmagstep}{OT1}
  1956. setfonttextscscshape{10}{mainmagstep}{OT1}
  1957. setfonttextttslttslshape{10}{mainmagstep}{OT1TT}
  1958. fonttexti=cmmi10 scaled mainmagstep
  1959. fonttextsy=cmsy10 scaled mainmagstep
  1960. deftextecsize{1000}
  1961. % A few fonts for @defun names and args.
  1962. setfontdefbfbfshape{10}{magstephalf}{OT1}
  1963. setfontdefttttshape{10}{magstephalf}{OT1TT}
  1964. setfontdefttslttslshape{10}{magstephalf}{OT1TT}
  1965. defdf{lettentt=deftt lettenbf = defbf lettenttsl=defttsl bf}
  1966. % Fonts for indices, footnotes, small examples (9pt).
  1967. defsmallnominalsize{9pt}
  1968. setfontsmallrmrmshape{9}{1000}{OT1}
  1969. setfontsmallttttshape{9}{1000}{OT1TT}
  1970. setfontsmallbfbfshape{10}{900}{OT1}
  1971. setfontsmallititshape{9}{1000}{OT1IT}
  1972. setfontsmallslslshape{9}{1000}{OT1}
  1973. setfontsmallsfsfshape{9}{1000}{OT1}
  1974. setfontsmallscscshape{10}{900}{OT1}
  1975. setfontsmallttslttslshape{10}{900}{OT1TT}
  1976. fontsmalli=cmmi9
  1977. fontsmallsy=cmsy9
  1978. defsmallecsize{0900}
  1979. % Fonts for small examples (8pt).
  1980. defsmallernominalsize{8pt}
  1981. setfontsmallerrmrmshape{8}{1000}{OT1}
  1982. setfontsmallerttttshape{8}{1000}{OT1TT}
  1983. setfontsmallerbfbfshape{10}{800}{OT1}
  1984. setfontsmallerititshape{8}{1000}{OT1IT}
  1985. setfontsmallerslslshape{8}{1000}{OT1}
  1986. setfontsmallersfsfshape{8}{1000}{OT1}
  1987. setfontsmallerscscshape{10}{800}{OT1}
  1988. setfontsmallerttslttslshape{10}{800}{OT1TT}
  1989. fontsmalleri=cmmi8
  1990. fontsmallersy=cmsy8
  1991. defsmallerecsize{0800}
  1992. % Fonts for title page (20.4pt):
  1993. deftitlenominalsize{20pt}
  1994. setfonttitlermrmbshape{12}{magstep3}{OT1}
  1995. setfonttitleititbshape{10}{magstep4}{OT1IT}
  1996. setfonttitleslslbshape{10}{magstep4}{OT1}
  1997. setfonttitlettttbshape{12}{magstep3}{OT1TT}
  1998. setfonttitlettslttslshape{10}{magstep4}{OT1TT}
  1999. setfonttitlesfsfbshape{17}{magstep1}{OT1}
  2000. lettitlebf=titlerm
  2001. setfonttitlescscbshape{10}{magstep4}{OT1}
  2002. fonttitlei=cmmi12 scaled magstep3
  2003. fonttitlesy=cmsy10 scaled magstep4
  2004. defauthorrm{secrm}
  2005. defauthortt{sectt}
  2006. deftitleecsize{2074}
  2007. % Chapter fonts (14.4pt).
  2008. defchapnominalsize{14pt}
  2009. setfontchaprmrmbshape{12}{magstep1}{OT1}
  2010. setfontchapititbshape{10}{magstep2}{OT1IT}
  2011. setfontchapslslbshape{10}{magstep2}{OT1}
  2012. setfontchapttttbshape{12}{magstep1}{OT1TT}
  2013. setfontchapttslttslshape{10}{magstep2}{OT1TT}
  2014. setfontchapsfsfbshape{12}{magstep1}{OT1}
  2015. letchapbfchaprm
  2016. setfontchapscscbshape{10}{magstep2}{OT1}
  2017. fontchapi=cmmi12 scaled magstep1
  2018. fontchapsy=cmsy10 scaled magstep2
  2019. defchapecsize{1440}
  2020. % Section fonts (12pt).
  2021. defsecnominalsize{12pt}
  2022. setfontsecrmrmbshape{12}{1000}{OT1}
  2023. setfontsecititbshape{10}{magstep1}{OT1IT}
  2024. setfontsecslslbshape{10}{magstep1}{OT1}
  2025. setfontsecttttbshape{12}{1000}{OT1TT}
  2026. setfontsecttslttslshape{10}{magstep1}{OT1TT}
  2027. setfontsecsfsfbshape{12}{1000}{OT1}
  2028. letsecbfsecrm
  2029. setfontsecscscbshape{10}{magstep1}{OT1}
  2030. fontseci=cmmi12 
  2031. fontsecsy=cmsy10 scaled magstep1
  2032. defsececsize{1200}
  2033. % Subsection fonts (10pt).
  2034. defssecnominalsize{10pt}
  2035. setfontssecrmrmbshape{10}{1000}{OT1}
  2036. setfontssecititbshape{10}{1000}{OT1IT}
  2037. setfontssecslslbshape{10}{1000}{OT1}
  2038. setfontssecttttbshape{10}{1000}{OT1TT}
  2039. setfontssecttslttslshape{10}{1000}{OT1TT}
  2040. setfontssecsfsfbshape{10}{1000}{OT1}
  2041. letssecbfssecrm
  2042. setfontssecscscbshape{10}{1000}{OT1}
  2043. fontsseci=cmmi10
  2044. fontssecsy=cmsy10
  2045. defssececsize{1000}
  2046. % Reduced fonts for @acro in text (9pt).
  2047. defreducednominalsize{9pt}
  2048. setfontreducedrmrmshape{9}{1000}{OT1}
  2049. setfontreducedttttshape{9}{1000}{OT1TT}
  2050. setfontreducedbfbfshape{10}{900}{OT1}
  2051. setfontreducedititshape{9}{1000}{OT1IT}
  2052. setfontreducedslslshape{9}{1000}{OT1}
  2053. setfontreducedsfsfshape{9}{1000}{OT1}
  2054. setfontreducedscscshape{10}{900}{OT1}
  2055. setfontreducedttslttslshape{10}{900}{OT1TT}
  2056. fontreducedi=cmmi9
  2057. fontreducedsy=cmsy9
  2058. defreducedecsize{0900}
  2059. % reduce space between paragraphs
  2060. divideparskip by 2
  2061. % reset the current fonts
  2062. textfonts
  2063. rm
  2064. } % end of 10pt text font size definitions
  2065. % We provide the user-level command
  2066. %   @fonttextsize 10
  2067. % (or 11) to redefine the text font size.  pt is assumed.
  2068. defxword{10}
  2069. defxiword{11}
  2070. %
  2071. parseargdeffonttextsize{%
  2072.   deftextsizearg{#1}%
  2073.   wlog{doing @fonttextsize textsizearg}%
  2074.   %
  2075.   % Set globaldefs so that documents can use this inside @tex, since
  2076.   % makeinfo 4.8 does not support it, but we need it nonetheless.
  2077.   % 
  2078.  begingroup globaldefs=1
  2079.   ifxtextsizeargxword definetextfontsizex
  2080.   else ifxtextsizeargxiword definetextfontsizexi
  2081.   else
  2082.     errhelp=EMsimple
  2083.     errmessage{@fonttextsize only supports `10' or `11', not `textsizearg'}
  2084.   fifi
  2085.  endgroup
  2086. }
  2087. % In order for the font changes to affect most math symbols and letters,
  2088. % we have to define the textfont of the standard families.  Since
  2089. % texinfo doesn't allow for producing subscripts and superscripts except
  2090. % in the main text, we don't bother to reset scriptfont and
  2091. % scriptscriptfont (which would also require loading a lot more fonts).
  2092. %
  2093. defresetmathfonts{%
  2094.   textfont0=tenrm textfont1=teni textfont2=tensy
  2095.   textfontitfam=tenit textfontslfam=tensl textfontbffam=tenbf
  2096.   textfontttfam=tentt textfontsffam=tensf
  2097. }
  2098. % The font-changing commands redefine the meanings of tenSTYLE, instead
  2099. % of just STYLE.  We do this because STYLE needs to also set the
  2100. % current fam for math mode.  Our STYLE (e.g., rm) commands hardwire
  2101. % tenSTYLE to set the current font.
  2102. %
  2103. % Each font-changing command also sets the names lsize (one size lower)
  2104. % and lllsize (three sizes lower).  These relative commands are used in
  2105. % the LaTeX logo and acronyms.
  2106. %
  2107. % This all needs generalizing, badly.
  2108. %
  2109. deftextfonts{%
  2110.   lettenrm=textrm lettenit=textit lettensl=textsl
  2111.   lettenbf=textbf lettentt=texttt letsmallcaps=textsc
  2112.   lettensf=textsf letteni=texti lettensy=textsy
  2113.   lettenttsl=textttsl
  2114.   defcurfontsize{text}%
  2115.   deflsize{reduced}deflllsize{smaller}%
  2116.   resetmathfonts setleading{textleading}}
  2117. deftitlefonts{%
  2118.   lettenrm=titlerm lettenit=titleit lettensl=titlesl
  2119.   lettenbf=titlebf lettentt=titlett letsmallcaps=titlesc
  2120.   lettensf=titlesf letteni=titlei lettensy=titlesy
  2121.   lettenttsl=titlettsl
  2122.   defcurfontsize{title}%
  2123.   deflsize{chap}deflllsize{subsec}%
  2124.   resetmathfonts setleading{25pt}}
  2125. deftitlefont#1{{titlefontsrm #1}}
  2126. defchapfonts{%
  2127.   lettenrm=chaprm lettenit=chapit lettensl=chapsl
  2128.   lettenbf=chapbf lettentt=chaptt letsmallcaps=chapsc
  2129.   lettensf=chapsf letteni=chapi lettensy=chapsy
  2130.   lettenttsl=chapttsl
  2131.   defcurfontsize{chap}%
  2132.   deflsize{sec}deflllsize{text}%
  2133.   resetmathfonts setleading{19pt}}
  2134. defsecfonts{%
  2135.   lettenrm=secrm lettenit=secit lettensl=secsl
  2136.   lettenbf=secbf lettentt=sectt letsmallcaps=secsc
  2137.   lettensf=secsf letteni=seci lettensy=secsy
  2138.   lettenttsl=secttsl
  2139.   defcurfontsize{sec}%
  2140.   deflsize{subsec}deflllsize{reduced}%
  2141.   resetmathfonts setleading{16pt}}
  2142. defsubsecfonts{%
  2143.   lettenrm=ssecrm lettenit=ssecit lettensl=ssecsl
  2144.   lettenbf=ssecbf lettentt=ssectt letsmallcaps=ssecsc
  2145.   lettensf=ssecsf letteni=sseci lettensy=ssecsy
  2146.   lettenttsl=ssecttsl
  2147.   defcurfontsize{ssec}%
  2148.   deflsize{text}deflllsize{small}%
  2149.   resetmathfonts setleading{15pt}}
  2150. letsubsubsecfonts = subsecfonts
  2151. defreducedfonts{%
  2152.   lettenrm=reducedrm lettenit=reducedit lettensl=reducedsl
  2153.   lettenbf=reducedbf lettentt=reducedtt letreducedcaps=reducedsc
  2154.   lettensf=reducedsf letteni=reducedi lettensy=reducedsy
  2155.   lettenttsl=reducedttsl
  2156.   defcurfontsize{reduced}%
  2157.   deflsize{small}deflllsize{smaller}%
  2158.   resetmathfonts setleading{10.5pt}}
  2159. defsmallfonts{%
  2160.   lettenrm=smallrm lettenit=smallit lettensl=smallsl
  2161.   lettenbf=smallbf lettentt=smalltt letsmallcaps=smallsc
  2162.   lettensf=smallsf letteni=smalli lettensy=smallsy
  2163.   lettenttsl=smallttsl
  2164.   defcurfontsize{small}%
  2165.   deflsize{smaller}deflllsize{smaller}%
  2166.   resetmathfonts setleading{10.5pt}}
  2167. defsmallerfonts{%
  2168.   lettenrm=smallerrm lettenit=smallerit lettensl=smallersl
  2169.   lettenbf=smallerbf lettentt=smallertt letsmallcaps=smallersc
  2170.   lettensf=smallersf letteni=smalleri lettensy=smallersy
  2171.   lettenttsl=smallerttsl
  2172.   defcurfontsize{smaller}%
  2173.   deflsize{smaller}deflllsize{smaller}%
  2174.   resetmathfonts setleading{9.5pt}}
  2175. % Set the fonts to use with the @small... environments.
  2176. letsmallexamplefonts = smallfonts
  2177. % About smallexamplefonts.  If we use smallfonts (9pt), @smallexample
  2178. % can fit this many characters:
  2179. %   8.5x11=86   smallbook=72  a4=90  a5=69
  2180. % If we use scriptfonts (8pt), then we can fit this many characters:
  2181. %   8.5x11=90+  smallbook=80  a4=90+  a5=77
  2182. % For me, subjectively, the few extra characters that fit aren't worth
  2183. % the additional smallness of 8pt.  So I'm making the default 9pt.
  2184. %
  2185. % By the way, for comparison, here's what fits with @example (10pt):
  2186. %   8.5x11=71  smallbook=60  a4=75  a5=58
  2187. %
  2188. % I wish the USA used A4 paper.
  2189. % --karl, 24jan03.
  2190. % Set up the default fonts, so we can use them for creating boxes.
  2191. %
  2192. definetextfontsizexi
  2193. % Define these so they can be easily changed for other fonts.
  2194. defangleleft{$langle$}
  2195. defangleright{$rangle$}
  2196. % Count depth in font-changes, for error checks
  2197. newcountfontdepth fontdepth=0
  2198. % Fonts for short table of contents.
  2199. setfontshortcontrmrmshape{12}{1000}{OT1}
  2200. setfontshortcontbfbfshape{10}{magstep1}{OT1}  % no cmb12
  2201. setfontshortcontslslshape{12}{1000}{OT1}
  2202. setfontshortcontttttshape{12}{1000}{OT1TT}
  2203. %% Add scribe-like font environments, plus @l for inline lisp (usually sans
  2204. %% serif) and @ii for TeX italic
  2205. % smartitalic{ARG} outputs arg in italics, followed by an italic correction
  2206. % unless the following character is such as not to need one.
  2207. defsmartitalicx{ifxnext,elseifxnext-elseifxnext.else
  2208.                     ptexslashfififi}
  2209. defsmartslanted#1{{ifusingttttslsl #1}futureletnextsmartitalicx}
  2210. defsmartitalic#1{{ifusingttttslit #1}futureletnextsmartitalicx}
  2211. % like smartslanted except unconditionally uses ttsl.
  2212. % @var is set to this for defun arguments.
  2213. defttslanted#1{{ttsl #1}futureletnextsmartitalicx}
  2214. % like smartslanted except unconditionally use sl.  We never want
  2215. % ttsl for book titles, do we?
  2216. defcite#1{{sl #1}futureletnextsmartitalicx}
  2217. leti=smartitalic
  2218. letslanted=smartslanted
  2219. letvar=smartslanted
  2220. letdfn=smartslanted
  2221. letemph=smartitalic
  2222. % @b, explicit bold.
  2223. defb#1{{bf #1}}
  2224. letstrong=b
  2225. % @sansserif, explicit sans.
  2226. defsansserif#1{{sf #1}}
  2227. % We can't just use exhyphenpenalty, because that only has effect at
  2228. % the end of a paragraph.  Restore normal hyphenation at the end of the
  2229. % group within which nohyphenation is presumably called.
  2230. %
  2231. defnohyphenation{hyphencharfont = -1  aftergrouprestorehyphenation}
  2232. defrestorehyphenation{hyphencharfont = `- }
  2233. % Set sfcode to normal for the chars that usually have another value.
  2234. % Can't use plain's frenchspacing because it uses the `x notation, and
  2235. % sometimes x has an active definition that messes things up.
  2236. %
  2237. catcode`@=11
  2238.   defplainfrenchspacing{%
  2239.     sfcodedotChar  =@m sfcodequestChar=@m sfcodeexclamChar=@m
  2240.     sfcodecolonChar=@m sfcodesemiChar =@m sfcodecommaChar =@m
  2241.     defendofsentencespacefactor{1000}% for @. and friends
  2242.   }
  2243.   defplainnonfrenchspacing{%
  2244.     sfcode`.3000sfcode`?3000sfcode`!3000
  2245.     sfcode`:2000sfcode`;1500sfcode`,1250
  2246.     defendofsentencespacefactor{3000}% for @. and friends
  2247.   }
  2248. catcode`@=other
  2249. defendofsentencespacefactor{3000}% default
  2250. deft#1{%
  2251.   {tt rawbackslash plainfrenchspacing #1}%
  2252.   null
  2253. }
  2254. defsamp#1{`tclose{#1}'null}
  2255. setfontkeyrmrmshape{8}{1000}{OT1}
  2256. fontkeysy=cmsy9
  2257. defkey#1{{keyrmtextfont2=keysy leavevmodehbox{%
  2258.   raise0.4pthbox{angleleft}kern-.08emvtop{%
  2259.     vbox{hrulekern-0.4pt
  2260.      hbox{raise0.4pthbox{vphantom{angleleft}}#1}}%
  2261.     kern-0.4pthrule}%
  2262.   kern-.06emraise0.4pthbox{angleright}}}}
  2263. defkey #1{{nohyphenation uppercase{#1}}null}
  2264. % The old definition, with no lozenge:
  2265. %defkey #1{{ttsl nohyphenation uppercase{#1}}null}
  2266. defctrl #1{{tt rawbackslash hat}#1}
  2267. % @file, @option are the same as @samp.
  2268. letfile=samp
  2269. letoption=samp
  2270. % @code is a modification of @t,
  2271. % which makes spaces the same size as normal in the surrounding text.
  2272. deftclose#1{%
  2273.   {%
  2274.     % Change normal interword space to be same as for the current font.
  2275.     spaceskip = fontdimen2font
  2276.     %
  2277.     % Switch to typewriter.
  2278.     tt
  2279.     %
  2280.     % But ` ' produces the large typewriter interword space.
  2281.     def {{spaceskip = 0pt{} }}%
  2282.     %
  2283.     % Turn off hyphenation.
  2284.     nohyphenation
  2285.     %
  2286.     rawbackslash
  2287.     plainfrenchspacing
  2288.     #1%
  2289.   }%
  2290.   null
  2291. }
  2292. % We *must* turn on hyphenation at `-' and `_' in @code.
  2293. % Otherwise, it is too hard to avoid overfull hboxes
  2294. % in the Emacs manual, the Library manual, etc.
  2295. % Unfortunately, TeX uses one parameter (hyphenchar) to control
  2296. % both hyphenation at - and hyphenation within words.
  2297. % We must therefore turn them both off (tclose does that)
  2298. % and arrange explicitly to hyphenate at a dash.
  2299. %  -- rms.
  2300. {
  2301.   catcode`-=active catcode`_=active
  2302.   catcode`'=active catcode``=active
  2303.   %
  2304.   globaldefcode{begingroup
  2305.     catcoderquoteChar=active catcodelquoteChar=active
  2306.     let'codequoteright let`codequoteleft
  2307.     %
  2308.     catcodedashChar=active  catcodeunderChar=active
  2309.     ifallowcodebreaks
  2310.      let-codedash
  2311.      let_codeunder
  2312.     else
  2313.      let-realdash
  2314.      let_realunder
  2315.     fi
  2316.     codex
  2317.   }
  2318. }
  2319. defrealdash{-}
  2320. defcodedash{-discretionary{}{}{}}
  2321. defcodeunder{%
  2322.   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
  2323.   % is "active" (mathcode"8000) and normalunderscore (or char95, etc.)
  2324.   % will therefore expand the active definition of _, which is us
  2325.   % (inside @code that is), therefore an endless loop.
  2326.   ifusingtt{ifmmode
  2327.                mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
  2328.              elsenormalunderscore fi
  2329.              discretionary{}{}{}}%
  2330.             {_}%
  2331. }
  2332. defcodex #1{tclose{#1}endgroup}
  2333. % An additional complication: the above will allow breaks after, e.g.,
  2334. % each of the four underscores in __typeof__.  This is undesirable in
  2335. % some manuals, especially if they don't have long identifiers in
  2336. % general.  @allowcodebreaks provides a way to control this.
  2337. newififallowcodebreaks  allowcodebreakstrue
  2338. defkeywordtrue{true}
  2339. defkeywordfalse{false}
  2340. parseargdefallowcodebreaks{%
  2341.   deftxiarg{#1}%
  2342.   ifxtxiargkeywordtrue
  2343.     allowcodebreakstrue
  2344.   elseifxtxiargkeywordfalse
  2345.     allowcodebreaksfalse
  2346.   else
  2347.     errhelp = EMsimple
  2348.     errmessage{Unknown @allowcodebreaks option `txiarg'}%
  2349.   fifi
  2350. }
  2351. % @kbd is like @code, except that if the argument is just one @key command,
  2352. % then @kbd has no effect.
  2353. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
  2354. %   `example' (@kbd uses ttsl only inside of @example and friends),
  2355. %   or `code' (@kbd uses normal tty font always).
  2356. parseargdefkbdinputstyle{%
  2357.   deftxiarg{#1}%
  2358.   ifxtxiargworddistinct
  2359.     gdefkbdexamplefont{ttsl}gdefkbdfont{ttsl}%
  2360.   elseifxtxiargwordexample
  2361.     gdefkbdexamplefont{ttsl}gdefkbdfont{tt}%
  2362.   elseifxtxiargwordcode
  2363.     gdefkbdexamplefont{tt}gdefkbdfont{tt}%
  2364.   else
  2365.     errhelp = EMsimple
  2366.     errmessage{Unknown @kbdinputstyle option `txiarg'}%
  2367.   fififi
  2368. }
  2369. defworddistinct{distinct}
  2370. defwordexample{example}
  2371. defwordcode{code}
  2372. % Default is `distinct.'
  2373. kbdinputstyle distinct
  2374. defxkey{key}
  2375. defkbdfoo#1#2#3par{defone{#1}defthree{#3}defthreex{??}%
  2376. ifxonexkeyifxthreexthree key{#2}%
  2377. else{tclose{kbdfontlook}}fi
  2378. else{tclose{kbdfontlook}}fi}
  2379. % For @indicateurl, @env, @command quotes seem unnecessary, so use code.
  2380. letindicateurl=code
  2381. letenv=code
  2382. letcommand=code
  2383. % @clicksequence{File @click{} Open ...}
  2384. defclicksequence#1{begingroup #1endgroup}
  2385. % @clickstyle @arrow   (by default)
  2386. parseargdefclickstyle{defclick{#1}}
  2387. defclick{arrow}
  2388. % @uref (abbreviation for `urlref') takes an optional (comma-separated)
  2389. % second argument specifying the text to display and an optional third
  2390. % arg as text to display instead of (rather than in addition to) the url
  2391. % itself.  First (mandatory) arg is the url.  Perhaps eventually put in
  2392. % a hypertex special here.
  2393. %
  2394. defuref#1{douref #1,,,finish}
  2395. defdouref#1,#2,#3,#4finish{begingroup
  2396.   unsepspaces
  2397.   pdfurl{#1}%
  2398.   setbox0 = hbox{ignorespaces #3}%
  2399.   ifdimwd0 > 0pt
  2400.     unhbox0 % third arg given, show only that
  2401.   else
  2402.     setbox0 = hbox{ignorespaces #2}%
  2403.     ifdimwd0 > 0pt
  2404.       ifpdf
  2405.         unhbox0             % PDF: 2nd arg given, show only it
  2406.       else
  2407.         unhbox0 (code{#1})% DVI: 2nd arg given, show both it and url
  2408.       fi
  2409.     else
  2410.       code{#1}% only url given, so show it
  2411.     fi
  2412.   fi
  2413.   endlink
  2414. endgroup}
  2415. % @url synonym for @uref, since that's how everyone uses it.
  2416. %
  2417. leturl=uref
  2418. % rms does not like angle brackets --karl, 17may97.
  2419. % So now @email is just like @uref, unless we are pdf.
  2420. %
  2421. %defemail#1{angleleft{tt #1}angleright}
  2422. ifpdf
  2423.   defemail#1{doemail#1,,finish}
  2424.   defdoemail#1,#2,#3finish{begingroup
  2425.     unsepspaces
  2426.     pdfurl{mailto:#1}%
  2427.     setbox0 = hbox{ignorespaces #2}%
  2428.     ifdimwd0>0ptunhbox0elsecode{#1}fi
  2429.     endlink
  2430.   endgroup}
  2431. else
  2432.   letemail=uref
  2433. fi
  2434. % Check if we are currently using a typewriter font.  Since all the
  2435. % Computer Modern typewriter fonts have zero interword stretch (and
  2436. % shrink), and it is reasonable to expect all typewriter fonts to have
  2437. % this property, we can check that font parameter.
  2438. %
  2439. defifmonospace{ifdimfontdimen3font=0pt }
  2440. % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
  2441. % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
  2442. %
  2443. defdmn#1{thinspace #1}
  2444. defkbd#1{deflook{#1}expandafterkbdfoolook??par}
  2445. % @l was never documented to mean ``switch to the Lisp font'',
  2446. % and it is not used as such in any manual I can find.  We need it for
  2447. % Polish suppressed-l.  --karl, 22sep96.
  2448. %defl#1{{li #1}null}
  2449. % Explicit font changes: @r, @sc, undocumented @ii.
  2450. defr#1{{rm #1}}              % roman font
  2451. defsc#1{{smallcaps#1}}       % smallcaps font
  2452. defii#1{{it #1}}             % italic font
  2453. % @acronym for "FBI", "NATO", and the like.
  2454. % We print this one point size smaller, since it's intended for
  2455. % all-uppercase.
  2456. defacronym#1{doacronym #1,,finish}
  2457. defdoacronym#1,#2,#3finish{%
  2458.   {selectfontslsize #1}%
  2459.   deftemp{#2}%
  2460.   ifxtempempty else
  2461.     space ({unsepspaces ignorespaces temp unskip})%
  2462.   fi
  2463. }
  2464. % @abbr for "Comput. J." and the like.
  2465. % No font change, but don't do end-of-sentence spacing.
  2466. defabbr#1{doabbr #1,,finish}
  2467. defdoabbr#1,#2,#3finish{%
  2468.   {plainfrenchspacing #1}%
  2469.   deftemp{#2}%
  2470.   ifxtempempty else
  2471.     space ({unsepspaces ignorespaces temp unskip})%
  2472.   fi
  2473. }
  2474. % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
  2475. %
  2476. defpounds{{it$}}
  2477. % @euro{} comes from a separate font, depending on the current style.
  2478. % We use the free feym* fonts from the eurosym package by Henrik
  2479. % Theiling, which support regular, slanted, bold and bold slanted (and
  2480. % "outlined" (blackboard board, sort of) versions, which we don't need).
  2481. % It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
  2482. % Although only regular is the truly official Euro symbol, we ignore
  2483. % that.  The Euro is designed to be slightly taller than the regular
  2484. % font height.
  2485. % feymr - regular
  2486. % feymo - slanted
  2487. % feybr - bold
  2488. % feybo - bold slanted
  2489. % There is no good (free) typewriter version, to my knowledge.
  2490. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
  2491. % Hmm.
  2492. % Also doesn't work in math.  Do we need to do math with euro symbols?
  2493. % Hope not.
  2494. defeuro{{eurofont e}}
  2495. defeurofont{%
  2496.   % We set the font at each command, rather than predefining it in
  2497.   % textfonts and the other font-switching commands, so that
  2498.   % installations which never need the symbol don't have to have the
  2499.   % font installed.
  2500.   % 
  2501.   % There is only one designed size (nominal 10pt), so we always scale
  2502.   % that to the current nominal size.
  2503.   % 
  2504.   % By the way, simply using "at 1em" works for cmr10 and the like, but
  2505.   % does not work for cmbx10 and other extended/shrunken fonts.
  2506.   % 
  2507.   defeurosize{csnamecurfontsize nominalsizeendcsname}%
  2508.   %
  2509.   ifxcurfontstylebfstylename 
  2510.     % bold:
  2511.     fontthiseurofont = ifusingit{feybo10}{feybr10} at eurosize
  2512.   else 
  2513.     % regular:
  2514.     fontthiseurofont = ifusingit{feymo10}{feymr10} at eurosize
  2515.   fi
  2516.   thiseurofont
  2517. }
  2518. % Hacks for glyphs from the EC fonts similar to euro.  We don't
  2519. % use let for the aliases, because sometimes we redefine the original
  2520. % macro, and the alias should reflect the redefinition.
  2521. defguillemetleft{{ecfont char"13}}
  2522. defguillemotleft{guillemetleft}
  2523. defguillemetright{{ecfont char"14}}
  2524. defguillemotright{guillemetright}
  2525. defguilsinglleft{{ecfont char"0E}}
  2526. defguilsinglright{{ecfont char"0F}}
  2527. defquotedblbase{{ecfont char"12}}
  2528. defquotesinglbase{{ecfont char"0D}}
  2529. %
  2530. defecfont{%
  2531.   % We can't distinguish serif/sanserif and italic/slanted, but this
  2532.   % is used for crude hacks anyway (like adding French and German
  2533.   % quotes to documents typeset with CM, where we lose kerning), so
  2534.   % hopefully nobody will notice/care.
  2535.   edefecsize{csnamecurfontsize ecsizeendcsname}%
  2536.   edefnominalsize{csnamecurfontsize nominalsizeendcsname}%
  2537.   ifxcurfontstylebfstylename
  2538.     % bold:
  2539.     fontthisecfont = ecbifusingit{i}{x}ecsize space at nominalsize
  2540.   else
  2541.     % regular:
  2542.     fontthisecfont = ecifusingit{ti}{rm}ecsize space at nominalsize
  2543.   fi
  2544.   thisecfont
  2545. }
  2546. % @registeredsymbol - R in a circle.  The font for the R should really
  2547. % be smaller yet, but lllsize is the best we can do for now.
  2548. % Adapted from the plain.tex definition of copyright.
  2549. %
  2550. defregisteredsymbol{%
  2551.   $^{{ooalign{hfilraise.07exhbox{selectfontslllsize R}%
  2552.                hfilcrcrOrb}}%
  2553.     }$%
  2554. }
  2555. % @textdegree - the normal degrees sign.
  2556. %
  2557. deftextdegree{$^circ$}
  2558. % Laurent Siebenmann reports Orb undefined with:
  2559. %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
  2560. % so we'll define it if necessary.
  2561. ifxOrbundefined
  2562. defOrb{mathhexbox20D}
  2563. fi
  2564. % Quotes.
  2565. chardefquotedblleft="5C
  2566. chardefquotedblright=`"
  2567. chardefquoteleft=``
  2568. chardefquoteright=`'
  2569. message{page headings,}
  2570. newskiptitlepagetopglue titlepagetopglue = 1.5in
  2571. newskiptitlepagebottomglue titlepagebottomglue = 2pc
  2572. % First the title page.  Must do @settitle before @titlepage.
  2573. newififseenauthor
  2574. newififfinishedtitlepage
  2575. % Do an implicit @contents or @shortcontents after @end titlepage if the
  2576. % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
  2577. %
  2578. newififsetcontentsaftertitlepage
  2579.  letsetcontentsaftertitlepage = setcontentsaftertitlepagetrue
  2580. newififsetshortcontentsaftertitlepage
  2581.  letsetshortcontentsaftertitlepage = setshortcontentsaftertitlepagetrue
  2582. parseargdefshorttitlepage{begingrouphbox{}vskip 1.5in chaprm centerline{#1}%
  2583.         endgrouppagehbox{}page}
  2584. envdeftitlepage{%
  2585.   % Open one extra group, as we want to close it in the middle of Etitlepage.
  2586.   begingroup
  2587.     parindent=0pt textfonts
  2588.     % Leave some space at the very top of the page.
  2589.     vgluetitlepagetopglue
  2590.     % No rule at page bottom unless we print one at the top with @title.
  2591.     finishedtitlepagetrue
  2592.     %
  2593.     % Most title ``pages'' are actually two pages long, with space
  2594.     % at the top of the second.  We don't want the ragged left on the second.
  2595.     letoldpage = page
  2596.     defpage{%
  2597.       iffinishedtitlepageelse
  2598.  finishtitlepage
  2599.       fi
  2600.       letpage = oldpage
  2601.       page
  2602.       null
  2603.     }%
  2604. }
  2605. defEtitlepage{%
  2606.     iffinishedtitlepageelse
  2607. finishtitlepage
  2608.     fi
  2609.     % It is important to do the page break before ending the group,
  2610.     % because the headline and footline are only empty inside the group.
  2611.     % If we use the new definition of page, we always get a blank page
  2612.     % after the title page, which we certainly don't want.
  2613.     oldpage
  2614.   endgroup
  2615.   %
  2616.   % Need this before the ...aftertitlepage checks so that if they are
  2617.   % in effect the toc pages will come out with page numbers.
  2618.   HEADINGSon
  2619.   %
  2620.   % If they want short, they certainly want long too.
  2621.   ifsetshortcontentsaftertitlepage
  2622.     shortcontents
  2623.     contents
  2624.     globalletshortcontents = relax
  2625.     globalletcontents = relax
  2626.   fi
  2627.   %
  2628.   ifsetcontentsaftertitlepage
  2629.     contents
  2630.     globalletcontents = relax
  2631.     globalletshortcontents = relax
  2632.   fi
  2633. }
  2634. deffinishtitlepage{%
  2635.   vskip4pt hrule height 2pt width hsize
  2636.   vskiptitlepagebottomglue
  2637.   finishedtitlepagetrue
  2638. }
  2639. %%% Macros to be used within @titlepage:
  2640. letsubtitlerm=tenrm
  2641. defsubtitlefont{subtitlerm normalbaselineskip = 13pt normalbaselines}
  2642. defauthorfont{authorrm normalbaselineskip = 16pt normalbaselines
  2643. lettt=authortt}
  2644. parseargdeftitle{%
  2645.   checkenvtitlepage
  2646.   leftline{titlefontsrm #1}
  2647.   % print a rule at the page bottom also.
  2648.   finishedtitlepagefalse
  2649.   vskip4pt hrule height 4pt width hsize vskip4pt
  2650. }
  2651. parseargdefsubtitle{%
  2652.   checkenvtitlepage
  2653.   {subtitlefont rightline{#1}}%
  2654. }
  2655. % @author should come last, but may come many times.
  2656. % It can also be used inside @quotation.
  2657. %
  2658. parseargdefauthor{%
  2659.   deftemp{quotation}%
  2660.   ifxthisenvtemp
  2661.     defquotationauthor{#1}% printed in Equotation.
  2662.   else
  2663.     checkenvtitlepage
  2664.     ifseenauthorelse vskip 0pt plus 1filll seenauthortrue fi
  2665.     {authorfont leftline{#1}}%
  2666.   fi
  2667. }
  2668. %%% Set up page headings and footings.
  2669. letthispage=folio
  2670. newtoksevenheadline    % headline on even pages
  2671. newtoksoddheadline     % headline on odd pages
  2672. newtoksevenfootline    % footline on even pages
  2673. newtoksoddfootline     % footline on odd pages
  2674. % Now make TeX use those variables
  2675. headline={{textfontsrm ifoddpageno theoddheadline
  2676.                             else theevenheadline fi}}
  2677. footline={{textfontsrm ifoddpageno theoddfootline
  2678.                             else theevenfootline fi}HEADINGShook}
  2679. letHEADINGShook=relax
  2680. % Commands to set those variables.
  2681. % For example, this is what  @headings on  does
  2682. % @evenheading @thistitle|@thispage|@thischapter
  2683. % @oddheading @thischapter|@thispage|@thistitle
  2684. % @evenfooting @thisfile||
  2685. % @oddfooting ||@thisfile
  2686. defevenheading{parseargevenheadingxxx}
  2687. defevenheadingxxx #1{evenheadingyyy #1||||finish}
  2688. defevenheadingyyy #1|#2|#3|#4finish{%
  2689. globalevenheadline={rlap{centerline{#2}}line{#1hfil#3}}}
  2690. defoddheading{parseargoddheadingxxx}
  2691. defoddheadingxxx #1{oddheadingyyy #1||||finish}
  2692. defoddheadingyyy #1|#2|#3|#4finish{%
  2693. globaloddheadline={rlap{centerline{#2}}line{#1hfil#3}}}
  2694. parseargdefeveryheading{oddheadingxxx{#1}evenheadingxxx{#1}}%
  2695. defevenfooting{parseargevenfootingxxx}
  2696. defevenfootingxxx #1{evenfootingyyy #1||||finish}
  2697. defevenfootingyyy #1|#2|#3|#4finish{%
  2698. globalevenfootline={rlap{centerline{#2}}line{#1hfil#3}}}
  2699. defoddfooting{parseargoddfootingxxx}
  2700. defoddfootingxxx #1{oddfootingyyy #1||||finish}
  2701. defoddfootingyyy #1|#2|#3|#4finish{%
  2702.   globaloddfootline = {rlap{centerline{#2}}line{#1hfil#3}}%
  2703.   %
  2704.   % Leave some space for the footline.  Hopefully ok to assume
  2705.   % @evenfooting will not be used by itself.
  2706.   globaladvancepageheight by -12pt
  2707.   globaladvancevsize by -12pt
  2708. }
  2709. parseargdefeveryfooting{oddfootingxxx{#1}evenfootingxxx{#1}}
  2710. % @evenheadingmarks top     thischapter <- chapter at the top of a page
  2711. % @evenheadingmarks bottom  thischapter <- chapter at the bottom of a page
  2712. %
  2713. % The same set of arguments for:
  2714. %
  2715. % @oddheadingmarks
  2716. % @evenfootingmarks
  2717. % @oddfootingmarks
  2718. % @everyheadingmarks
  2719. % @everyfootingmarks
  2720. defevenheadingmarks{headingmarks{even}{heading}}
  2721. defoddheadingmarks{headingmarks{odd}{heading}}
  2722. defevenfootingmarks{headingmarks{even}{footing}}
  2723. defoddfootingmarks{headingmarks{odd}{footing}}
  2724. defeveryheadingmarks#1 {headingmarks{even}{heading}{#1}
  2725.                           headingmarks{odd}{heading}{#1} }
  2726. defeveryfootingmarks#1 {headingmarks{even}{footing}{#1}
  2727.                           headingmarks{odd}{footing}{#1} }
  2728. % #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
  2729. defheadingmarks#1#2#3 {%
  2730.   expandafterletexpandaftertemp csname get#3headingmarksendcsname
  2731.   globalexpandafterletcsname get#1#2marksendcsname temp
  2732. }
  2733. everyheadingmarks bottom
  2734. everyfootingmarks bottom
  2735. % @headings double      turns headings on for double-sided printing.
  2736. % @headings single      turns headings on for single-sided printing.
  2737. % @headings off         turns them off.
  2738. % @headings on          same as @headings double, retained for compatibility.
  2739. % @headings after       turns on double-sided headings after this page.
  2740. % @headings doubleafter turns on double-sided headings after this page.
  2741. % @headings singleafter turns on single-sided headings after this page.