"SfR Fresh" - the SfR Freeware/Shareware Archive

Member "wget-1.11.4/doc/texinfo.tex" of archive wget-1.11.4.tar.gz:


As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) TeX and LaTeX source code syntax highlighting with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
    1 % texinfo.tex -- TeX macros to handle Texinfo files.
    2 %
    3 % Load plain if necessary, i.e., if running under initex.
    4 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
    5 %
    6 \def\texinfoversion{2004-11-25.16}
    7 %
    8 % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
    9 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
   10 % 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, or (at
   15 % 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 texinfo.tex file.  If not, see
   24 % <http://www.gnu.org/licenses/>.
   25 %
   26 % As a special exception, when this file is read by TeX when processing
   27 % a Texinfo source document, you may use the result without
   28 % restriction.  (This has been our intent since Texinfo was invented.)
   29 %
   30 % Please try the latest version of texinfo.tex before submitting bug
   31 % reports; you can get the latest version from:
   32 %   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
   33 %   ftp://tug.org/tex/texinfo.tex
   34 %     (and all CTAN mirrors, see http://www.ctan.org).
   35 % The texinfo.tex in any given distribution could well be out
   36 % of date, so if that's what you're using, please check.
   37 %
   38 % Send bug reports to bug-texinfo@gnu.org.  Please include including a
   39 % complete document in each bug report with which we can reproduce the
   40 % problem.  Patches are, of course, greatly appreciated.
   41 %
   42 % To process a Texinfo manual with TeX, it's most reliable to use the
   43 % texi2dvi shell script that comes with the distribution.  For a simple
   44 % manual foo.texi, however, you can get away with this:
   45 %   tex foo.texi
   46 %   texindex foo.??
   47 %   tex foo.texi
   48 %   tex foo.texi
   49 %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
   50 % The extra TeX runs get the cross-reference information correct.
   51 % Sometimes one run after texindex suffices, and sometimes you need more
   52 % than two; texi2dvi does it as many times as necessary.
   53 %
   54 % It is possible to adapt texinfo.tex for other languages, to some
   55 % extent.  You can get the existing language-specific files from the
   56 % full Texinfo distribution.
   57 %
   58 % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
   59 
   60 
   61 \message{Loading texinfo [version \texinfoversion]:}
   62 
   63 % If in a .fmt file, print the version number
   64 % and turn on active characters that we couldn't do earlier because
   65 % they might have appeared in the input file name.
   66 \everyjob{\message{[Texinfo version \texinfoversion]}%
   67   \catcode`+=\active \catcode`\_=\active}
   68 
   69 \message{Basics,}
   70 \chardef\other=12
   71 
   72 % We never want plain's \outer definition of \+ in Texinfo.
   73 % For @tex, we can use \tabalign.
   74 \let\+ = \relax
   75 
   76 % Save some plain tex macros whose names we will redefine.
   77 \let\ptexb=\b
   78 \let\ptexbullet=\bullet
   79 \let\ptexc=\c
   80 \let\ptexcomma=\,
   81 \let\ptexdot=\.
   82 \let\ptexdots=\dots
   83 \let\ptexend=\end
   84 \let\ptexequiv=\equiv
   85 \let\ptexexclam=\!
   86 \let\ptexfootnote=\footnote
   87 \let\ptexgtr=>
   88 \let\ptexhat=^
   89 \let\ptexi=\i
   90 \let\ptexindent=\indent
   91 \let\ptexinsert=\insert
   92 \let\ptexlbrace=\{
   93 \let\ptexless=<
   94 \let\ptexnewwrite\newwrite
   95 \let\ptexnoindent=\noindent
   96 \let\ptexplus=+
   97 \let\ptexrbrace=\}
   98 \let\ptexslash=\/
   99 \let\ptexstar=\*
  100 \let\ptext=\t
  101 
  102 % If this character appears in an error message or help string, it
  103 % starts a new line in the output.
  104 \newlinechar = `^^J
  105 
  106 % Use TeX 3.0's \inputlineno to get the line number, for better error
  107 % messages, but if we're using an old version of TeX, don't do anything.
  108 %
  109 \ifx\inputlineno\thisisundefined
  110   \let\linenumber = \empty % Pre-3.0.
  111 \else
  112   \def\linenumber{l.\the\inputlineno:\space}
  113 \fi
  114 
  115 % Set up fixed words for English if not already set.
  116 \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
  117 \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
  118 \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
  119 \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
  120 \ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
  121 \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
  122 \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
  123 \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
  124 \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
  125 \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
  126 \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
  127 \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
  128 \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
  129 \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
  130 \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
  131 \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
  132 \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
  133 \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
  134 \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
  135 %
  136 \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
  137 \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
  138 \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
  139 \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
  140 \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
  141 \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
  142 \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
  143 \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
  144 \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
  145 \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
  146 \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
  147 \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
  148 %
  149 \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
  150 \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
  151 \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
  152 \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
  153 \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
  154 
  155 % In some macros, we cannot use the `\? notation---the left quote is
  156 % in some cases the escape char.
  157 \chardef\colonChar = `\:
  158 \chardef\commaChar = `\,
  159 \chardef\dotChar   = `\.
  160 \chardef\exclamChar= `\!
  161 \chardef\questChar = `\?
  162 \chardef\semiChar  = `\;
  163 \chardef\underChar = `\_
  164 
  165 \chardef\spaceChar = `\ %
  166 \chardef\spacecat = 10
  167 \def\spaceisspace{\catcode\spaceChar=\spacecat}
  168 
  169 % Ignore a token.
  170 %
  171 \def\gobble#1{}
  172 
  173 % The following is used inside several \edef's.
  174 \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
  175 
  176 % Hyphenation fixes.
  177 \hyphenation{
  178   Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
  179   ap-pen-dix bit-map bit-maps
  180   data-base data-bases eshell fall-ing half-way long-est man-u-script
  181   man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
  182   par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
  183   spell-ing spell-ings
  184   stand-alone strong-est time-stamp time-stamps which-ever white-space
  185   wide-spread wrap-around
  186 }
  187 
  188 % Margin to add to right of even pages, to left of odd pages.
  189 \newdimen\bindingoffset
  190 \newdimen\normaloffset
  191 \newdimen\pagewidth \newdimen\pageheight
  192 
  193 % For a final copy, take out the rectangles
  194 % that mark overfull boxes (in case you have decided
  195 % that the text looks ok even though it passes the margin).
  196 %
  197 \def\finalout{\overfullrule=0pt}
  198 
  199 % @| inserts a changebar to the left of the current line.  It should
  200 % surround any changed text.  This approach does *not* work if the
  201 % change spans more than two lines of output.  To handle that, we would
  202 % have adopt a much more difficult approach (putting marks into the main
  203 % vertical list for the beginning and end of each change).
  204 %
  205 \def\|{%
  206   % \vadjust can only be used in horizontal mode.
  207   \leavevmode
  208   %
  209   % Append this vertical mode material after the current line in the output.
  210   \vadjust{%
  211     % We want to insert a rule with the height and depth of the current
  212     % leading; that is exactly what \strutbox is supposed to record.
  213     \vskip-\baselineskip
  214     %
  215     % \vadjust-items are inserted at the left edge of the type.  So
  216     % the \llap here moves out into the left-hand margin.
  217     \llap{%
  218       %
  219       % For a thicker or thinner bar, change the `1pt'.
  220       \vrule height\baselineskip width1pt
  221       %
  222       % This is the space between the bar and the text.
  223       \hskip 12pt
  224     }%
  225   }%
  226 }
  227 
  228 % Sometimes it is convenient to have everything in the transcript file
  229 % and nothing on the terminal.  We don't just call \tracingall here,
  230 % since that produces some useless output on the terminal.  We also make
  231 % some effort to order the tracing commands to reduce output in the log
  232 % file; cf. trace.sty in LaTeX.
  233 %
  234 \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
  235 \def\loggingall{%
  236   \tracingstats2
  237   \tracingpages1
  238   \tracinglostchars2  % 2 gives us more in etex
  239   \tracingparagraphs1
  240   \tracingoutput1
  241   \tracingmacros2
  242   \tracingrestores1
  243   \showboxbreadth\maxdimen \showboxdepth\maxdimen
  244   \ifx\eTeXversion\undefined\else % etex gives us more logging
  245     \tracingscantokens1
  246     \tracingifs1
  247     \tracinggroups1
  248     \tracingnesting2
  249     \tracingassigns1
  250   \fi
  251   \tracingcommands3  % 3 gives us more in etex
  252   \errorcontextlines16
  253 }%
  254 
  255 % add check for \lastpenalty to plain's definitions.  If the last thing
  256 % we did was a \nobreak, we don't want to insert more space.
  257 %
  258 \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
  259   \removelastskip\penalty-50\smallskip\fi\fi}
  260 \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
  261   \removelastskip\penalty-100\medskip\fi\fi}
  262 \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
  263   \removelastskip\penalty-200\bigskip\fi\fi}
  264 
  265 % For @cropmarks command.
  266 % Do @cropmarks to get crop marks.
  267 %
  268 \newif\ifcropmarks
  269 \let\cropmarks = \cropmarkstrue
  270 %
  271 % Dimensions to add cropmarks at corners.
  272 % Added by P. A. MacKay, 12 Nov. 1986
  273 %
  274 \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
  275 \newdimen\cornerlong  \cornerlong=1pc
  276 \newdimen\cornerthick \cornerthick=.3pt
  277 \newdimen\topandbottommargin \topandbottommargin=.75in
  278 
  279 % Main output routine.
  280 \chardef\PAGE = 255
  281 \output = {\onepageout{\pagecontents\PAGE}}
  282 
  283 \newbox\headlinebox
  284 \newbox\footlinebox
  285 
  286 % \onepageout takes a vbox as an argument.  Note that \pagecontents
  287 % does insertions, but you have to call it yourself.
  288 \def\onepageout#1{%
  289   \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
  290   %
  291   \ifodd\pageno  \advance\hoffset by \bindingoffset
  292   \else \advance\hoffset by -\bindingoffset\fi
  293   %
  294   % Do this outside of the \shipout so @code etc. will be expanded in
  295   % the headline as they should be, not taken literally (outputting ''code).
  296   \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
  297   \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
  298   %
  299   {%
  300     % Have to do this stuff outside the \shipout because we want it to
  301     % take effect in \write's, yet the group defined by the \vbox ends
  302     % before the \shipout runs.
  303     %
  304     \escapechar = `\\     % use backslash in output files.
  305     \indexdummies         % don't expand commands in the output.
  306     \normalturnoffactive  % \ in index entries must not stay \, e.g., if
  307                    % the page break happens to be in the middle of an example.
  308     \shipout\vbox{%
  309       % Do this early so pdf references go to the beginning of the page.
  310       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
  311       %
  312       \ifcropmarks \vbox to \outervsize\bgroup
  313         \hsize = \outerhsize
  314         \vskip-\topandbottommargin
  315         \vtop to0pt{%
  316           \line{\ewtop\hfil\ewtop}%
  317           \nointerlineskip
  318           \line{%
  319             \vbox{\moveleft\cornerthick\nstop}%
  320             \hfill
  321             \vbox{\moveright\cornerthick\nstop}%
  322           }%
  323           \vss}%
  324         \vskip\topandbottommargin
  325         \line\bgroup
  326           \hfil % center the page within the outer (page) hsize.
  327           \ifodd\pageno\hskip\bindingoffset\fi
  328           \vbox\bgroup
  329       \fi
  330       %
  331       \unvbox\headlinebox
  332       \pagebody{#1}%
  333       \ifdim\ht\footlinebox > 0pt
  334         % Only leave this space if the footline is nonempty.
  335         % (We lessened \vsize for it in \oddfootingxxx.)
  336         % The \baselineskip=24pt in plain's \makefootline has no effect.
  337         \vskip 2\baselineskip
  338         \unvbox\footlinebox
  339       \fi
  340       %
  341       \ifcropmarks
  342           \egroup % end of \vbox\bgroup
  343         \hfil\egroup % end of (centering) \line\bgroup
  344         \vskip\topandbottommargin plus1fill minus1fill
  345         \boxmaxdepth = \cornerthick
  346         \vbox to0pt{\vss
  347           \line{%
  348             \vbox{\moveleft\cornerthick\nsbot}%
  349             \hfill
  350             \vbox{\moveright\cornerthick\nsbot}%
  351           }%
  352           \nointerlineskip
  353           \line{\ewbot\hfil\ewbot}%
  354         }%
  355       \egroup % \vbox from first cropmarks clause
  356       \fi
  357     }% end of \shipout\vbox
  358   }% end of group with \normalturnoffactive
  359   \advancepageno
  360   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
  361 }
  362 
  363 \newinsert\margin \dimen\margin=\maxdimen
  364 
  365 \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
  366 {\catcode`\@ =11
  367 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
  368 % marginal hacks, juha@viisa.uucp (Juha Takala)
  369 \ifvoid\margin\else % marginal info is present
  370   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
  371 \dimen@=\dp#1 \unvbox#1
  372 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
  373 \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
  374 }
  375 
  376 % Here are the rules for the cropmarks.  Note that they are
  377 % offset so that the space between them is truly \outerhsize or \outervsize
  378 % (P. A. MacKay, 12 November, 1986)
  379 %
  380 \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
  381 \def\nstop{\vbox
  382   {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
  383 \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
  384 \def\nsbot{\vbox
  385   {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
  386 
  387 % Parse an argument, then pass it to #1.  The argument is the rest of
  388 % the input line (except we remove a trailing comment).  #1 should be a
  389 % macro which expects an ordinary undelimited TeX argument.
  390 %
  391 \def\parsearg{\parseargusing{}}
  392 \def\parseargusing#1#2{%
  393   \def\next{#2}%
  394   \begingroup
  395     \obeylines
  396     \spaceisspace
  397     #1%
  398     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
  399 }
  400 
  401 {\obeylines %
  402   \gdef\parseargline#1^^M{%
  403     \endgroup % End of the group started in \parsearg.
  404     \argremovecomment #1\comment\ArgTerm%
  405   }%
  406 }
  407 
  408 % First remove any @comment, then any @c comment.
  409 \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
  410 \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
  411 
  412 % Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
  413 %
  414 % \argremovec might leave us with trailing space, e.g.,
  415 %    @end itemize  @c foo
  416 % This space token undergoes the same procedure and is eventually removed
  417 % by \finishparsearg.
  418 %
  419 \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
  420 \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
  421 \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
  422   \def\temp{#3}%
  423   \ifx\temp\empty
  424     % We cannot use \next here, as it holds the macro to run;
  425     % thus we reuse \temp.
  426     \let\temp\finishparsearg
  427   \else
  428     \let\temp\argcheckspaces
  429   \fi
  430   % Put the space token in:
  431   \temp#1 #3\ArgTerm
  432 }
  433 
  434 % If a _delimited_ argument is enclosed in braces, they get stripped; so
  435 % to get _exactly_ the rest of the line, we had to prevent such situation.
  436 % We prepended an \empty token at the very beginning and we expand it now,
  437 % just before passing the control to \next.
  438 % (Similarily, we have to think about #3 of \argcheckspacesY above: it is
  439 % either the null string, or it ends with \^^M---thus there is no danger
  440 % that a pair of braces would be stripped.
  441 %
  442 % But first, we have to remove the trailing space token.
  443 %
  444 \def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
  445 
  446 % \parseargdef\foo{...}
  447 %	is roughly equivalent to
  448 % \def\foo{\parsearg\Xfoo}
  449 % \def\Xfoo#1{...}
  450 %
  451 % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
  452 % favourite TeX trick.  --kasal, 16nov03
  453 
  454 \def\parseargdef#1{%
  455   \expandafter \doparseargdef \csname\string#1\endcsname #1%
  456 }
  457 \def\doparseargdef#1#2{%
  458   \def#2{\parsearg#1}%
  459   \def#1##1%
  460 }
  461 
  462 % Several utility definitions with active space:
  463 {
  464   \obeyspaces
  465   \gdef\obeyedspace{ }
  466 
  467   % Make each space character in the input produce a normal interword
  468   % space in the output.  Don't allow a line break at this space, as this
  469   % is used only in environments like @example, where each line of input
  470   % should produce a line of output anyway.
  471   %
  472   \gdef\sepspaces{\obeyspaces\let =\tie}
  473 
  474   % If an index command is used in an @example environment, any spaces
  475   % therein should become regular spaces in the raw index file, not the
  476   % expansion of \tie (\leavevmode \penalty \@M \ ).
  477   \gdef\unsepspaces{\let =\space}
  478 }
  479 
  480 
  481 \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
  482 
  483 % Define the framework for environments in texinfo.tex.  It's used like this:
  484 %
  485 %   \envdef\foo{...}
  486 %   \def\Efoo{...}
  487 %
  488 % It's the responsibility of \envdef to insert \begingroup before the
  489 % actual body; @end closes the group after calling \Efoo.  \envdef also
  490 % defines \thisenv, so the current environment is known; @end checks
  491 % whether the environment name matches.  The \checkenv macro can also be
  492 % used to check whether the current environment is the one expected.
  493 %
  494 % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
  495 % are not treated as enviroments; they don't open a group.  (The
  496 % implementation of @end takes care not to call \endgroup in this
  497 % special case.)
  498 
  499 
  500 % At runtime, environments start with this:
  501 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
  502 % initialize
  503 \let\thisenv\empty
  504 
  505 % ... but they get defined via ``\envdef\foo{...}'':
  506 \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
  507 \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
  508 
  509 % Check whether we're in the right environment:
  510 \def\checkenv#1{%
  511   \def\temp{#1}%
  512   \ifx\thisenv\temp
  513   \else
  514     \badenverr
  515   \fi
  516 }
  517 
  518 % Evironment mismatch, #1 expected:
  519 \def\badenverr{%
  520   \errhelp = \EMsimple
  521   \errmessage{This command can appear only \inenvironment\temp,
  522     not \inenvironment\thisenv}%
  523 }
  524 \def\inenvironment#1{%
  525   \ifx#1\empty
  526     out of any environment%
  527   \else
  528     in environment \expandafter\string#1%
  529   \fi
  530 }
  531 
  532 % @end foo executes the definition of \Efoo.
  533 % But first, it executes a specialized version of \checkenv
  534 %
  535 \parseargdef\end{%
  536   \if 1\csname iscond.#1\endcsname
  537   \else
  538     % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
  539     \expandafter\checkenv\csname#1\endcsname
  540     \csname E#1\endcsname
  541     \endgroup
  542   \fi
  543 }
  544 
  545 \newhelp\EMsimple{Press RETURN to continue.}
  546 
  547 
  548 %% Simple single-character @ commands
  549 
  550 % @@ prints an @
  551 % Kludge this until the fonts are right (grr).
  552 \def\@{{\tt\char64}}
  553 
  554 % This is turned off because it was never documented
  555 % and you can use @w{...} around a quote to suppress ligatures.
  556 %% Define @` and @' to be the same as ` and '
  557 %% but suppressing ligatures.
  558 %\def\`{{`}}
  559 %\def\'{{'}}
  560 
  561 % Used to generate quoted braces.
  562 \def\mylbrace {{\tt\char123}}
  563 \def\myrbrace {{\tt\char125}}
  564 \let\{=\mylbrace
  565 \let\}=\myrbrace
  566 \begingroup
  567   % Definitions to produce \{ and \} commands for indices,
  568   % and @{ and @} for the aux file.
  569   \catcode`\{ = \other \catcode`\} = \other
  570   \catcode`\[ = 1 \catcode`\] = 2
  571   \catcode`\! = 0 \catcode`\\ = \other
  572   !gdef!lbracecmd[\{]%
  573   !gdef!rbracecmd[\}]%
  574   !gdef!lbraceatcmd[@{]%
  575   !gdef!rbraceatcmd[@}]%
  576 !endgroup
  577 
  578 % @comma{} to avoid , parsing problems.
  579 \let\comma = ,
  580 
  581 % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
  582 % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
  583 \let\, = \c
  584 \let\dotaccent = \.
  585 \def\ringaccent#1{{\accent23 #1}}
  586 \let\tieaccent = \t
  587 \let\ubaraccent = \b
  588 \let\udotaccent = \d
  589 
  590 % Other special characters: @questiondown @exclamdown @ordf @ordm
  591 % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
  592 \def\questiondown{?`}
  593 \def\exclamdown{!`}
  594 \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
  595 \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
  596 
  597 % Dotless i and dotless j, used for accents.
  598 \def\imacro{i}
  599 \def\jmacro{j}
  600 \def\dotless#1{%
  601   \def\temp{#1}%
  602   \ifx\temp\imacro \ptexi
  603   \else\ifx\temp\jmacro \j
  604   \else \errmessage{@dotless can be used only with i or j}%
  605   \fi\fi
  606 }
  607 
  608 % The \TeX{} logo, as in plain, but resetting the spacing so that a
  609 % period following counts as ending a sentence.  (Idea found in latex.)
  610 %
  611 \edef\TeX{\TeX \spacefactor=1000 }
  612 
  613 % @LaTeX{} logo.  Not quite the same results as the definition in
  614 % latex.ltx, since we use a different font for the raised A; it's most
  615 % convenient for us to use an explicitly smaller font, rather than using
  616 % the \scriptstyle font (since we don't reset \scriptstyle and
  617 % \scriptscriptstyle).
  618 %
  619 \def\LaTeX{%
  620   L\kern-.36em
  621   {\setbox0=\hbox{T}%
  622    \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
  623   \kern-.15em
  624   \TeX
  625 }
  626 
  627 % Be sure we're in horizontal mode when doing a tie, since we make space
  628 % equivalent to this in @example-like environments. Otherwise, a space
  629 % at the beginning of a line will start with \penalty -- and
  630 % since \penalty is valid in vertical mode, we'd end up putting the
  631 % penalty on the vertical list instead of in the new paragraph.
  632 {\catcode`@ = 11
  633  % Avoid using \@M directly, because that causes trouble
  634  % if the definition is written into an index file.
  635  \global\let\tiepenalty = \@M
  636  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
  637 }
  638 
  639 % @: forces normal size whitespace following.
  640 \def\:{\spacefactor=1000 }
  641 
  642 % @* forces a line break.
  643 \def\*{\hfil\break\hbox{}\ignorespaces}
  644 
  645 % @/ allows a line break.
  646 \let\/=\allowbreak
  647 
  648 % @. is an end-of-sentence period.
  649 \def\.{.\spacefactor=3000 }
  650 
  651 % @! is an end-of-sentence bang.
  652 \def\!{!\spacefactor=3000 }
  653 
  654 % @? is an end-of-sentence query.
  655 \def\?{?\spacefactor=3000 }
  656 
  657 % @w prevents a word break.  Without the \leavevmode, @w at the
  658 % beginning of a paragraph, when TeX is still in vertical mode, would
  659 % produce a whole line of output instead of starting the paragraph.
  660 \def\w#1{\leavevmode\hbox{#1}}
  661 
  662 % @group ... @end group forces ... to be all on one page, by enclosing
  663 % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
  664 % to keep its height that of a normal line.  According to the rules for
  665 % \topskip (p.114 of the TeXbook), the glue inserted is
  666 % max (\topskip - \ht (first item), 0).  If that height is large,
  667 % therefore, no glue is inserted, and the space between the headline and
  668 % the text is small, which looks bad.
  669 %
  670 % Another complication is that the group might be very large.  This can
  671 % cause the glue on the previous page to be unduly stretched, because it
  672 % does not have much material.  In this case, it's better to add an
  673 % explicit \vfill so that the extra space is at the bottom.  The
  674 % threshold for doing this is if the group is more than \vfilllimit
  675 % percent of a page (\vfilllimit can be changed inside of @tex).
  676 %
  677 \newbox\groupbox
  678 \def\vfilllimit{0.7}
  679 %
  680 \envdef\group{%
  681   \ifnum\catcode`\^^M=\active \else
  682     \errhelp = \groupinvalidhelp
  683     \errmessage{@group invalid in context where filling is enabled}%
  684   \fi
  685   \startsavinginserts
  686   %
  687   \setbox\groupbox = \vtop\bgroup
  688     % Do @comment since we are called inside an environment such as
  689     % @example, where each end-of-line in the input causes an
  690     % end-of-line in the output.  We don't want the end-of-line after
  691     % the `@group' to put extra space in the output.  Since @group
  692     % should appear on a line by itself (according to the Texinfo
  693     % manual), we don't worry about eating any user text.
  694     \comment
  695 }
  696 %
  697 % The \vtop produces a box with normal height and large depth; thus, TeX puts
  698 % \baselineskip glue before it, and (when the next line of text is done)
  699 % \lineskip glue after it.  Thus, space below is not quite equal to space
  700 % above.  But it's pretty close.
  701 \def\Egroup{%
  702     % To get correct interline space between the last line of the group
  703     % and the first line afterwards, we have to propagate \prevdepth.
  704     \endgraf % Not \par, as it may have been set to \lisppar.
  705     \global\dimen1 = \prevdepth
  706   \egroup           % End the \vtop.
  707   % \dimen0 is the vertical size of the group's box.
  708   \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
  709   % \dimen2 is how much space is left on the page (more or less).
  710   \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
  711   % if the group doesn't fit on the current page, and it's a big big
  712   % group, force a page break.
  713   \ifdim \dimen0 > \dimen2
  714     \ifdim \pagetotal < \vfilllimit\pageheight
  715       \page
  716     \fi
  717   \fi
  718   \box\groupbox
  719   \prevdepth = \dimen1
  720   \checkinserts
  721 }
  722 %
  723 % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
  724 % message, so this ends up printing `@group can only ...'.
  725 %
  726 \newhelp\groupinvalidhelp{%
  727 group can only be used in environments such as @example,^^J%
  728 where each line of input produces a line of output.}
  729 
  730 % @need space-in-mils
  731 % forces a page break if there is not space-in-mils remaining.
  732 
  733 \newdimen\mil  \mil=0.001in
  734 
  735 % Old definition--didn't work.
  736 %\parseargdef\need{\par %
  737 %% This method tries to make TeX break the page naturally
  738 %% if the depth of the box does not fit.
  739 %{\baselineskip=0pt%
  740 %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
  741 %\prevdepth=-1000pt
  742 %}}
  743 
  744 \parseargdef\need{%
  745   % Ensure vertical mode, so we don't make a big box in the middle of a
  746   % paragraph.
  747   \par
  748   %
  749   % If the @need value is less than one line space, it's useless.
  750   \dimen0 = #1\mil
  751   \dimen2 = \ht\strutbox
  752   \advance\dimen2 by \dp\strutbox
  753   \ifdim\dimen0 > \dimen2
  754     %
  755     % Do a \strut just to make the height of this box be normal, so the
  756     % normal leading is inserted relative to the preceding line.
  757     % And a page break here is fine.
  758     \vtop to #1\mil{\strut\vfil}%
  759     %
  760     % TeX does not even consider page breaks if a penalty added to the
  761     % main vertical list is 10000 or more.  But in order to see if the
  762     % empty box we just added fits on the page, we must make it consider
  763     % page breaks.  On the other hand, we don't want to actually break the
  764     % page after the empty box.  So we use a penalty of 9999.
  765     %
  766     % There is an extremely small chance that TeX will actually break the
  767     % page at this \penalty, if there are no other feasible breakpoints in
  768     % sight.  (If the user is using lots of big @group commands, which
  769     % almost-but-not-quite fill up a page, TeX will have a hard time doing
  770     % good page breaking, for example.)  However, I could not construct an
  771     % example where a page broke at this \penalty; if it happens in a real
  772     % document, then we can reconsider our strategy.
  773     \penalty9999
  774     %
  775     % Back up by the size of the box, whether we did a page break or not.
  776     \kern -#1\mil
  777     %
  778     % Do not allow a page break right after this kern.
  779     \nobreak
  780   \fi
  781 }
  782 
  783 % @br   forces paragraph break (and is undocumented).
  784 
  785 \let\br = \par
  786 
  787 % @page forces the start of a new page.
  788 %
  789 \def\page{\par\vfill\supereject}
  790 
  791 % @exdent text....
  792 % outputs text on separate line in roman font, starting at standard page margin
  793 
  794 % This records the amount of indent in the innermost environment.
  795 % That's how much \exdent should take out.
  796 \newskip\exdentamount
  797 
  798 % This defn is used inside fill environments such as @defun.
  799 \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
  800 
  801 % This defn is used inside nofill environments such as @example.
  802 \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
  803   \leftline{\hskip\leftskip{\rm#1}}}}
  804 
  805 % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
  806 % paragraph.  For more general purposes, use the \margin insertion
  807 % class.  WHICH is `l' or `r'.
  808 %
  809 \newskip\inmarginspacing \inmarginspacing=1cm
  810 \def\strutdepth{\dp\strutbox}
  811 %
  812 \def\doinmargin#1#2{\strut\vadjust{%
  813   \nobreak
  814   \kern-\strutdepth
  815   \vtop to \strutdepth{%
  816     \baselineskip=\strutdepth
  817     \vss
  818     % if you have multiple lines of stuff to put here, you'll need to
  819     % make the vbox yourself of the appropriate size.
  820     \ifx#1l%
  821       \llap{\ignorespaces #2\hskip\inmarginspacing}%
  822     \else
  823       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
  824     \fi
  825     \null
  826   }%
  827 }}
  828 \def\inleftmargin{\doinmargin l}
  829 \def\inrightmargin{\doinmargin r}
  830 %
  831 % @inmargin{TEXT [, RIGHT-TEXT]}
  832 % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
  833 % else use TEXT for both).
  834 %
  835 \def\inmargin#1{\parseinmargin #1,,\finish}
  836 \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
  837   \setbox0 = \hbox{\ignorespaces #2}%
  838   \ifdim\wd0 > 0pt
  839     \def\lefttext{#1}%  have both texts
  840     \def\righttext{#2}%
  841   \else
  842     \def\lefttext{#1}%  have only one text
  843     \def\righttext{#1}%
  844   \fi
  845   %
  846   \ifodd\pageno
  847     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
  848   \else
  849     \def\temp{\inleftmargin\lefttext}%
  850   \fi
  851   \temp
  852 }
  853 
  854 % @include file    insert text of that file as input.
  855 %
  856 \def\include{\parseargusing\filenamecatcodes\includezzz}
  857 \def\includezzz#1{%
  858   \pushthisfilestack
  859   \def\thisfile{#1}%
  860   {%
  861     \makevalueexpandable
  862     \def\temp{\input #1 }%
  863     \expandafter
  864   }\temp
  865   \popthisfilestack
  866 }
  867 \def\filenamecatcodes{%
  868   \catcode`\\=\other
  869   \catcode`~=\other
  870   \catcode`^=\other
  871   \catcode`_=\other
  872   \catcode`|=\other
  873   \catcode`<=\other
  874   \catcode`>=\other
  875   \catcode`+=\other
  876   \catcode`-=\other
  877 }
  878 
  879 \def\pushthisfilestack{%
  880   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
  881 }
  882 \def\pushthisfilestackX{%
  883   \expandafter\pushthisfilestackY\thisfile\StackTerm
  884 }
  885 \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
  886   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
  887 }
  888 
  889 \def\popthisfilestack{\errthisfilestackempty}
  890 \def\errthisfilestackempty{\errmessage{Internal error:
  891   the stack of filenames is empty.}}
  892 
  893 \def\thisfile{}
  894 
  895 % @center line
  896 % outputs that line, centered.
  897 %
  898 \parseargdef\center{%
  899   \ifhmode
  900     \let\next\centerH
  901   \else
  902     \let\next\centerV
  903   \fi
  904   \next{\hfil \ignorespaces#1\unskip \hfil}%
  905 }
  906 \def\centerH#1{%
  907   {%
  908     \hfil\break
  909     \advance\hsize by -\leftskip
  910     \advance\hsize by -\rightskip
  911     \line{#1}%
  912     \break
  913   }%
  914 }
  915 \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
  916 
  917 % @sp n   outputs n lines of vertical space
  918 
  919 \parseargdef\sp{\vskip #1\baselineskip}
  920 
  921 % @comment ...line which is ignored...
  922 % @c is the same as @comment
  923 % @ignore ... @end ignore  is another way to write a comment
  924 
  925 \def\comment{\begingroup \catcode`\^^M=\other%
  926 \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
  927 \commentxxx}
  928 {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
  929 
  930 \let\c=\comment
  931 
  932 % @paragraphindent NCHARS
  933 % We'll use ems for NCHARS, close enough.
  934 % NCHARS can also be the word `asis' or `none'.
  935 % We cannot feasibly implement @paragraphindent asis, though.
  936 %
  937 \def\asisword{asis} % no translation, these are keywords
  938 \def\noneword{none}
  939 %
  940 \parseargdef\paragraphindent{%
  941   \def\temp{#1}%
  942   \ifx\temp\asisword
  943   \else
  944     \ifx\temp\noneword
  945       \defaultparindent = 0pt
  946     \else
  947       \defaultparindent = #1em
  948     \fi
  949   \fi
  950   \parindent = \defaultparindent
  951 }
  952 
  953 % @exampleindent NCHARS
  954 % We'll use ems for NCHARS like @paragraphindent.
  955 % It seems @exampleindent asis isn't necessary, but
  956 % I preserve it to make it similar to @paragraphindent.
  957 \parseargdef\exampleindent{%
  958   \def\temp{#1}%
  959   \ifx\temp\asisword
  960   \else
  961     \ifx\temp\noneword
  962       \lispnarrowing = 0pt
  963     \else
  964       \lispnarrowing = #1em
  965     \fi
  966   \fi
  967 }
  968 
  969 % @firstparagraphindent WORD
  970 % If WORD is `none', then suppress indentation of the first paragraph
  971 % after a section heading.  If WORD is `insert', then do indent at such
  972 % paragraphs.
  973 %
  974 % The paragraph indentation is suppressed or not by calling
  975 % \suppressfirstparagraphindent, which the sectioning commands do.
  976 % We switch the definition of this back and forth according to WORD.
  977 % By default, we suppress indentation.
  978 %
  979 \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
  980 \def\insertword{insert}
  981 %
  982 \parseargdef\firstparagraphindent{%
  983   \def\temp{#1}%
  984   \ifx\temp\noneword
  985     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
  986   \else\ifx\temp\insertword
  987     \let\suppressfirstparagraphindent = \relax
  988   \else
  989     \errhelp = \EMsimple
  990     \errmessage{Unknown @firstparagraphindent option `\temp'}%
  991   \fi\fi
  992 }
  993 
  994 % Here is how we actually suppress indentation.  Redefine \everypar to
  995 % \kern backwards by \parindent, and then reset itself to empty.
  996 %
  997 % We also make \indent itself not actually do anything until the next
  998 % paragraph.
  999 %
 1000 \gdef\dosuppressfirstparagraphindent{%
 1001   \gdef\indent{%
 1002     \restorefirstparagraphindent
 1003     \indent
 1004   }%
 1005   \gdef\noindent{%
 1006     \restorefirstparagraphindent
 1007     \noindent
 1008   }%
 1009   \global\everypar = {%
 1010     \kern -\parindent
 1011     \restorefirstparagraphindent
 1012   }%
 1013 }
 1014 
 1015 \gdef\restorefirstparagraphindent{%
 1016   \global \let \indent = \ptexindent
 1017   \global \let \noindent = \ptexnoindent
 1018   \global \everypar = {}%
 1019 }
 1020 
 1021 
 1022 % @asis just yields its argument.  Used with @table, for example.
 1023 %
 1024 \def\asis#1{#1}
 1025 
 1026 % @math outputs its argument in math mode.
 1027 %
 1028 % One complication: _ usually means subscripts, but it could also mean
 1029 % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
 1030 % _ active, and distinguish by seeing if the current family is \slfam,
 1031 % which is what @var uses.
 1032 {
 1033   \catcode\underChar = \active
 1034   \gdef\mathunderscore{%
 1035     \catcode\underChar=\active
 1036     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
 1037   }
 1038 }
 1039 % Another complication: we want \\ (and @\) to output a \ character.
 1040 % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
 1041 % this is not advertised and we don't care.  Texinfo does not
 1042 % otherwise define @\.
 1043 %
 1044 % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
 1045 \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
 1046 %
 1047 \def\math{%
 1048   \tex
 1049   \mathunderscore
 1050   \let\\ = \mathbackslash
 1051   \mathactive
 1052   $\finishmath
 1053 }
 1054 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
 1055 
 1056 % Some active characters (such as <) are spaced differently in math.
 1057 % We have to reset their definitions in case the @math was an argument
 1058 % to a command which sets the catcodes (such as @item or @section).
 1059 %
 1060 {
 1061   \catcode`^ = \active
 1062   \catcode`< = \active
 1063   \catcode`> = \active
 1064   \catcode`+ = \active
 1065   \gdef\mathactive{%
 1066     \let^ = \ptexhat
 1067     \let< = \ptexless
 1068     \let> = \ptexgtr
 1069     \let+ = \ptexplus
 1070   }
 1071 }
 1072 
 1073 % @bullet and @minus need the same treatment as @math, just above.
 1074 \def\bullet{$\ptexbullet$}
 1075 \def\minus{$-$}
 1076 
 1077 % @dots{} outputs an ellipsis using the current font.
 1078 % We do .5em per period so that it has the same spacing in a typewriter
 1079 % font as three actual period characters.
 1080 %
 1081 \def\dots{%
 1082   \leavevmode
 1083   \hbox to 1.5em{%
 1084     \hskip 0pt plus 0.25fil
 1085     .\hfil.\hfil.