Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
| Download
GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
Project: cocalc-sagemath-dev-slelievre
Views: 418346% texinfo.tex -- TeX macros to handle Texinfo files.1%2% Load plain if necessary, i.e., if running under initex.3\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi4%5\def\texinfoversion{2013-02-01.11}6%7% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,8% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,9% 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.10%11% This texinfo.tex file is free software: you can redistribute it and/or12% modify it under the terms of the GNU General Public License as13% published by the Free Software Foundation, either version 3 of the14% License, or (at your option) any later version.15%16% This texinfo.tex file is distributed in the hope that it will be17% useful, but WITHOUT ANY WARRANTY; without even the implied warranty18% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU19% General Public License for more details.20%21% You should have received a copy of the GNU General Public License22% along with this program. If not, see <http://www.gnu.org/licenses/>.23%24% As a special exception, when this file is read by TeX when processing25% a Texinfo source document, you may use the result without26% restriction. This Exception is an additional permission under section 727% of the GNU General Public License, version 3 ("GPLv3").28%29% Please try the latest version of texinfo.tex before submitting bug30% reports; you can get the latest version from:31% http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or32% http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or33% http://www.gnu.org/software/texinfo/ (the Texinfo home page)34% The texinfo.tex in any given distribution could well be out35% of date, so if that's what you're using, please check.36%37% Send bug reports to [email protected]. Please include including a38% complete document in each bug report with which we can reproduce the39% problem. Patches are, of course, greatly appreciated.40%41% To process a Texinfo manual with TeX, it's most reliable to use the42% texi2dvi shell script that comes with the distribution. For a simple43% manual foo.texi, however, you can get away with this:44% tex foo.texi45% texindex foo.??46% tex foo.texi47% tex foo.texi48% 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 more51% than two; texi2dvi does it as many times as necessary.52%53% It is possible to adapt texinfo.tex for other languages, to some54% extent. You can get the existing language-specific files from the55% full Texinfo distribution.56%57% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.585960\message{Loading texinfo [version \texinfoversion]:}6162% If in a .fmt file, print the version number63% and turn on active characters that we couldn't do earlier because64% they might have appeared in the input file name.65\everyjob{\message{[Texinfo version \texinfoversion]}%66\catcode`+=\active \catcode`\_=\active}6768\chardef\other=126970% We never want plain's \outer definition of \+ in Texinfo.71% For @tex, we can use \tabalign.72\let\+ = \relax7374% Save some plain tex macros whose names we will redefine.75\let\ptexb=\b76\let\ptexbullet=\bullet77\let\ptexc=\c78\let\ptexcomma=\,79\let\ptexdot=\.80\let\ptexdots=\dots81\let\ptexend=\end82\let\ptexequiv=\equiv83\let\ptexexclam=\!84\let\ptexfootnote=\footnote85\let\ptexgtr=>86\let\ptexhat=^87\let\ptexi=\i88\let\ptexindent=\indent89\let\ptexinsert=\insert90\let\ptexlbrace=\{91\let\ptexless=<92\let\ptexnewwrite\newwrite93\let\ptexnoindent=\noindent94\let\ptexplus=+95\let\ptexraggedright=\raggedright96\let\ptexrbrace=\}97\let\ptexslash=\/98\let\ptexstar=\*99\let\ptext=\t100\let\ptextop=\top101{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode102103% If this character appears in an error message or help string, it104% starts a new line in the output.105\newlinechar = `^^J106107% Use TeX 3.0's \inputlineno to get the line number, for better error108% messages, but if we're using an old version of TeX, don't do anything.109%110\ifx\inputlineno\thisisundefined111\let\linenumber = \empty % Pre-3.0.112\else113\def\linenumber{l.\the\inputlineno:\space}114\fi115116% Set up fixed words for English if not already set.117\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi118\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi119\ifx\putworderror\undefined \gdef\putworderror{error}\fi120\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi121\ifx\putwordin\undefined \gdef\putwordin{in}\fi122\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi123\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi124\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi125\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi126\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi127\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi128\ifx\putwordof\undefined \gdef\putwordof{of}\fi129\ifx\putwordon\undefined \gdef\putwordon{on}\fi130\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi131\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi132\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi133\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi134\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi135\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi136\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi137%138\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi139\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi140\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi141\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi142\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi143\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi144\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi145\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi146\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi147\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi148\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi149\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi150%151\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi152\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi153\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi154\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi155\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi156157% Since the category of space is not known, we have to be careful.158\chardef\spacecat = 10159\def\spaceisspace{\catcode`\ =\spacecat}160161% sometimes characters are active, so we need control sequences.162\chardef\ampChar = `\&163\chardef\colonChar = `\:164\chardef\commaChar = `\,165\chardef\dashChar = `\-166\chardef\dotChar = `\.167\chardef\exclamChar= `\!168\chardef\hashChar = `\#169\chardef\lquoteChar= `\`170\chardef\questChar = `\?171\chardef\rquoteChar= `\'172\chardef\semiChar = `\;173\chardef\slashChar = `\/174\chardef\underChar = `\_175176% Ignore a token.177%178\def\gobble#1{}179180% The following is used inside several \edef's.181\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}182183% Hyphenation fixes.184\hyphenation{185Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script186ap-pen-dix bit-map bit-maps187data-base data-bases eshell fall-ing half-way long-est man-u-script188man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm189par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces190spell-ing spell-ings191stand-alone strong-est time-stamp time-stamps which-ever white-space192wide-spread wrap-around193}194195% Margin to add to right of even pages, to left of odd pages.196\newdimen\bindingoffset197\newdimen\normaloffset198\newdimen\pagewidth \newdimen\pageheight199200% For a final copy, take out the rectangles201% that mark overfull boxes (in case you have decided202% that the text looks ok even though it passes the margin).203%204\def\finalout{\overfullrule=0pt }205206% Sometimes it is convenient to have everything in the transcript file207% and nothing on the terminal. We don't just call \tracingall here,208% since that produces some useless output on the terminal. We also make209% some effort to order the tracing commands to reduce output in the log210% file; cf. trace.sty in LaTeX.211%212\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%213\def\loggingall{%214\tracingstats2215\tracingpages1216\tracinglostchars2 % 2 gives us more in etex217\tracingparagraphs1218\tracingoutput1219\tracingmacros2220\tracingrestores1221\showboxbreadth\maxdimen \showboxdepth\maxdimen222\ifx\eTeXversion\thisisundefined\else % etex gives us more logging223\tracingscantokens1224\tracingifs1225\tracinggroups1226\tracingnesting2227\tracingassigns1228\fi229\tracingcommands3 % 3 gives us more in etex230\errorcontextlines16231}%232233% @errormsg{MSG}. Do the index-like expansions on MSG, but if things234% aren't perfect, it's not the end of the world, being an error message,235% after all.236%237\def\errormsg{\begingroup \indexnofonts \doerrormsg}238\def\doerrormsg#1{\errmessage{#1}}239240% add check for \lastpenalty to plain's definitions. If the last thing241% we did was a \nobreak, we don't want to insert more space.242%243\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount244\removelastskip\penalty-50\smallskip\fi\fi}245\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount246\removelastskip\penalty-100\medskip\fi\fi}247\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount248\removelastskip\penalty-200\bigskip\fi\fi}249250% Do @cropmarks to get crop marks.251%252\newif\ifcropmarks253\let\cropmarks = \cropmarkstrue254%255% Dimensions to add cropmarks at corners.256% Added by P. A. MacKay, 12 Nov. 1986257%258\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines259\newdimen\cornerlong \cornerlong=1pc260\newdimen\cornerthick \cornerthick=.3pt261\newdimen\topandbottommargin \topandbottommargin=.75in262263% Output a mark which sets \thischapter, \thissection and \thiscolor.264% We dump everything together because we only have one kind of mark.265% This works because we only use \botmark / \topmark, not \firstmark.266%267% A mark contains a subexpression of the \ifcase ... \fi construct.268% \get*marks macros below extract the needed part using \ifcase.269%270% Another complication is to let the user choose whether \thischapter271% (\thissection) refers to the chapter (section) in effect at the top272% of a page, or that at the bottom of a page. The solution is273% described on page 260 of The TeXbook. It involves outputting two274% marks for the sectioning macros, one before the section break, and275% one after. I won't pretend I can describe this better than DEK...276\def\domark{%277\toks0=\expandafter{\lastchapterdefs}%278\toks2=\expandafter{\lastsectiondefs}%279\toks4=\expandafter{\prevchapterdefs}%280\toks6=\expandafter{\prevsectiondefs}%281\toks8=\expandafter{\lastcolordefs}%282\mark{%283\the\toks0 \the\toks2284\noexpand\or \the\toks4 \the\toks6285\noexpand\else \the\toks8286}%287}288% \topmark doesn't work for the very first chapter (after the title289% page or the contents), so we use \firstmark there -- this gets us290% the mark with the chapter defs, unless the user sneaks in, e.g.,291% @setcolor (or @url, or @link, etc.) between @contents and the very292% first @chapter.293\def\gettopheadingmarks{%294\ifcase0\topmark\fi295\ifx\thischapter\empty \ifcase0\firstmark\fi \fi296}297\def\getbottomheadingmarks{\ifcase1\botmark\fi}298\def\getcolormarks{\ifcase2\topmark\fi}299300% Avoid "undefined control sequence" errors.301\def\lastchapterdefs{}302\def\lastsectiondefs{}303\def\prevchapterdefs{}304\def\prevsectiondefs{}305\def\lastcolordefs{}306307% Main output routine.308\chardef\PAGE = 255309\output = {\onepageout{\pagecontents\PAGE}}310311\newbox\headlinebox312\newbox\footlinebox313314% \onepageout takes a vbox as an argument. Note that \pagecontents315% does insertions, but you have to call it yourself.316\def\onepageout#1{%317\ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi318%319\ifodd\pageno \advance\hoffset by \bindingoffset320\else \advance\hoffset by -\bindingoffset\fi321%322% Do this outside of the \shipout so @code etc. will be expanded in323% the headline as they should be, not taken literally (outputting ''code).324\ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi325\setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%326\ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi327\setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%328%329{%330% Have to do this stuff outside the \shipout because we want it to331% take effect in \write's, yet the group defined by the \vbox ends332% before the \shipout runs.333%334\indexdummies % don't expand commands in the output.335\normalturnoffactive % \ in index entries must not stay \, e.g., if336% the page break happens to be in the middle of an example.337% We don't want .vr (or whatever) entries like this:338% \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}339% "\acronym" won't work when it's read back in;340% it needs to be341% {\code {{\tt \backslashcurfont }acronym}342\shipout\vbox{%343% Do this early so pdf references go to the beginning of the page.344\ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi345%346\ifcropmarks \vbox to \outervsize\bgroup347\hsize = \outerhsize348\vskip-\topandbottommargin349\vtop to0pt{%350\line{\ewtop\hfil\ewtop}%351\nointerlineskip352\line{%353\vbox{\moveleft\cornerthick\nstop}%354\hfill355\vbox{\moveright\cornerthick\nstop}%356}%357\vss}%358\vskip\topandbottommargin359\line\bgroup360\hfil % center the page within the outer (page) hsize.361\ifodd\pageno\hskip\bindingoffset\fi362\vbox\bgroup363\fi364%365\unvbox\headlinebox366\pagebody{#1}%367\ifdim\ht\footlinebox > 0pt368% Only leave this space if the footline is nonempty.369% (We lessened \vsize for it in \oddfootingyyy.)370% The \baselineskip=24pt in plain's \makefootline has no effect.371\vskip 24pt372\unvbox\footlinebox373\fi374%375\ifcropmarks376\egroup % end of \vbox\bgroup377\hfil\egroup % end of (centering) \line\bgroup378\vskip\topandbottommargin plus1fill minus1fill379\boxmaxdepth = \cornerthick380\vbox to0pt{\vss381\line{%382\vbox{\moveleft\cornerthick\nsbot}%383\hfill384\vbox{\moveright\cornerthick\nsbot}%385}%386\nointerlineskip387\line{\ewbot\hfil\ewbot}%388}%389\egroup % \vbox from first cropmarks clause390\fi391}% end of \shipout\vbox392}% end of group with \indexdummies393\advancepageno394\ifnum\outputpenalty>-20000 \else\dosupereject\fi395}396397\newinsert\margin \dimen\margin=\maxdimen398399\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}400{\catcode`\@ =11401\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi402% marginal hacks, [email protected] (Juha Takala)403\ifvoid\margin\else % marginal info is present404\rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi405\dimen@=\dp#1\relax \unvbox#1\relax406\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi407\ifr@ggedbottom \kern-\dimen@ \vfil \fi}408}409410% Here are the rules for the cropmarks. Note that they are411% offset so that the space between them is truly \outerhsize or \outervsize412% (P. A. MacKay, 12 November, 1986)413%414\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}415\def\nstop{\vbox416{\hrule height\cornerthick depth\cornerlong width\cornerthick}}417\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}418\def\nsbot{\vbox419{\hrule height\cornerlong depth\cornerthick width\cornerthick}}420421% Parse an argument, then pass it to #1. The argument is the rest of422% the input line (except we remove a trailing comment). #1 should be a423% macro which expects an ordinary undelimited TeX argument.424%425\def\parsearg{\parseargusing{}}426\def\parseargusing#1#2{%427\def\argtorun{#2}%428\begingroup429\obeylines430\spaceisspace431#1%432\parseargline\empty% Insert the \empty token, see \finishparsearg below.433}434435{\obeylines %436\gdef\parseargline#1^^M{%437\endgroup % End of the group started in \parsearg.438\argremovecomment #1\comment\ArgTerm%439}%440}441442% First remove any @comment, then any @c comment.443\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}444\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}445446% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.447%448% \argremovec might leave us with trailing space, e.g.,449% @end itemize @c foo450% This space token undergoes the same procedure and is eventually removed451% by \finishparsearg.452%453\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}454\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}455\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%456\def\temp{#3}%457\ifx\temp\empty458% Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:459\let\temp\finishparsearg460\else461\let\temp\argcheckspaces462\fi463% Put the space token in:464\temp#1 #3\ArgTerm465}466467% If a _delimited_ argument is enclosed in braces, they get stripped; so468% to get _exactly_ the rest of the line, we had to prevent such situation.469% We prepended an \empty token at the very beginning and we expand it now,470% just before passing the control to \argtorun.471% (Similarly, we have to think about #3 of \argcheckspacesY above: it is472% either the null string, or it ends with \^^M---thus there is no danger473% that a pair of braces would be stripped.474%475% But first, we have to remove the trailing space token.476%477\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}478479% \parseargdef\foo{...}480% is roughly equivalent to481% \def\foo{\parsearg\Xfoo}482% \def\Xfoo#1{...}483%484% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my485% favourite TeX trick. --kasal, 16nov03486487\def\parseargdef#1{%488\expandafter \doparseargdef \csname\string#1\endcsname #1%489}490\def\doparseargdef#1#2{%491\def#2{\parsearg#1}%492\def#1##1%493}494495% Several utility definitions with active space:496{497\obeyspaces498\gdef\obeyedspace{ }499500% Make each space character in the input produce a normal interword501% space in the output. Don't allow a line break at this space, as this502% is used only in environments like @example, where each line of input503% should produce a line of output anyway.504%505\gdef\sepspaces{\obeyspaces\let =\tie}506507% If an index command is used in an @example environment, any spaces508% therein should become regular spaces in the raw index file, not the509% expansion of \tie (\leavevmode \penalty \@M \ ).510\gdef\unsepspaces{\let =\space}511}512513514\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}515516% Define the framework for environments in texinfo.tex. It's used like this:517%518% \envdef\foo{...}519% \def\Efoo{...}520%521% It's the responsibility of \envdef to insert \begingroup before the522% actual body; @end closes the group after calling \Efoo. \envdef also523% defines \thisenv, so the current environment is known; @end checks524% whether the environment name matches. The \checkenv macro can also be525% used to check whether the current environment is the one expected.526%527% Non-false conditionals (@iftex, @ifset) don't fit into this, so they528% are not treated as environments; they don't open a group. (The529% implementation of @end takes care not to call \endgroup in this530% special case.)531532533% At run-time, environments start with this:534\def\startenvironment#1{\begingroup\def\thisenv{#1}}535% initialize536\let\thisenv\empty537538% ... but they get defined via ``\envdef\foo{...}'':539\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}540\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}541542% Check whether we're in the right environment:543\def\checkenv#1{%544\def\temp{#1}%545\ifx\thisenv\temp546\else547\badenverr548\fi549}550551% Environment mismatch, #1 expected:552\def\badenverr{%553\errhelp = \EMsimple554\errmessage{This command can appear only \inenvironment\temp,555not \inenvironment\thisenv}%556}557\def\inenvironment#1{%558\ifx#1\empty559outside of any environment%560\else561in environment \expandafter\string#1%562\fi563}564565% @end foo executes the definition of \Efoo.566% But first, it executes a specialized version of \checkenv567%568\parseargdef\end{%569\if 1\csname iscond.#1\endcsname570\else571% The general wording of \badenverr may not be ideal.572\expandafter\checkenv\csname#1\endcsname573\csname E#1\endcsname574\endgroup575\fi576}577578\newhelp\EMsimple{Press RETURN to continue.}579580581% Be sure we're in horizontal mode when doing a tie, since we make space582% equivalent to this in @example-like environments. Otherwise, a space583% at the beginning of a line will start with \penalty -- and584% since \penalty is valid in vertical mode, we'd end up putting the585% penalty on the vertical list instead of in the new paragraph.586{\catcode`@ = 11587% Avoid using \@M directly, because that causes trouble588% if the definition is written into an index file.589\global\let\tiepenalty = \@M590\gdef\tie{\leavevmode\penalty\tiepenalty\ }591}592593% @: forces normal size whitespace following.594\def\:{\spacefactor=1000 }595596% @* forces a line break.597\def\*{\unskip\hfil\break\hbox{}\ignorespaces}598599% @/ allows a line break.600\let\/=\allowbreak601602% @. is an end-of-sentence period.603\def\.{.\spacefactor=\endofsentencespacefactor\space}604605% @! is an end-of-sentence bang.606\def\!{!\spacefactor=\endofsentencespacefactor\space}607608% @? is an end-of-sentence query.609\def\?{?\spacefactor=\endofsentencespacefactor\space}610611% @frenchspacing on|off says whether to put extra space after punctuation.612%613\def\onword{on}614\def\offword{off}615%616\parseargdef\frenchspacing{%617\def\temp{#1}%618\ifx\temp\onword \plainfrenchspacing619\else\ifx\temp\offword \plainnonfrenchspacing620\else621\errhelp = \EMsimple622\errmessage{Unknown @frenchspacing option `\temp', must be on|off}%623\fi\fi624}625626% @w prevents a word break. Without the \leavevmode, @w at the627% beginning of a paragraph, when TeX is still in vertical mode, would628% produce a whole line of output instead of starting the paragraph.629\def\w#1{\leavevmode\hbox{#1}}630631% @group ... @end group forces ... to be all on one page, by enclosing632% it in a TeX vbox. We use \vtop instead of \vbox to construct the box633% to keep its height that of a normal line. According to the rules for634% \topskip (p.114 of the TeXbook), the glue inserted is635% max (\topskip - \ht (first item), 0). If that height is large,636% therefore, no glue is inserted, and the space between the headline and637% the text is small, which looks bad.638%639% Another complication is that the group might be very large. This can640% cause the glue on the previous page to be unduly stretched, because it641% does not have much material. In this case, it's better to add an642% explicit \vfill so that the extra space is at the bottom. The643% threshold for doing this is if the group is more than \vfilllimit644% percent of a page (\vfilllimit can be changed inside of @tex).645%646\newbox\groupbox647\def\vfilllimit{0.7}648%649\envdef\group{%650\ifnum\catcode`\^^M=\active \else651\errhelp = \groupinvalidhelp652\errmessage{@group invalid in context where filling is enabled}%653\fi654\startsavinginserts655%656\setbox\groupbox = \vtop\bgroup657% Do @comment since we are called inside an environment such as658% @example, where each end-of-line in the input causes an659% end-of-line in the output. We don't want the end-of-line after660% the `@group' to put extra space in the output. Since @group661% should appear on a line by itself (according to the Texinfo662% manual), we don't worry about eating any user text.663\comment664}665%666% The \vtop produces a box with normal height and large depth; thus, TeX puts667% \baselineskip glue before it, and (when the next line of text is done)668% \lineskip glue after it. Thus, space below is not quite equal to space669% above. But it's pretty close.670\def\Egroup{%671% To get correct interline space between the last line of the group672% and the first line afterwards, we have to propagate \prevdepth.673\endgraf % Not \par, as it may have been set to \lisppar.674\global\dimen1 = \prevdepth675\egroup % End the \vtop.676% \dimen0 is the vertical size of the group's box.677\dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox678% \dimen2 is how much space is left on the page (more or less).679\dimen2 = \pageheight \advance\dimen2 by -\pagetotal680% if the group doesn't fit on the current page, and it's a big big681% group, force a page break.682\ifdim \dimen0 > \dimen2683\ifdim \pagetotal < \vfilllimit\pageheight684\page685\fi686\fi687\box\groupbox688\prevdepth = \dimen1689\checkinserts690}691%692% TeX puts in an \escapechar (i.e., `@') at the beginning of the help693% message, so this ends up printing `@group can only ...'.694%695\newhelp\groupinvalidhelp{%696group can only be used in environments such as @example,^^J%697where each line of input produces a line of output.}698699% @need space-in-mils700% forces a page break if there is not space-in-mils remaining.701702\newdimen\mil \mil=0.001in703704\parseargdef\need{%705% Ensure vertical mode, so we don't make a big box in the middle of a706% paragraph.707\par708%709% If the @need value is less than one line space, it's useless.710\dimen0 = #1\mil711\dimen2 = \ht\strutbox712\advance\dimen2 by \dp\strutbox713\ifdim\dimen0 > \dimen2714%715% Do a \strut just to make the height of this box be normal, so the716% normal leading is inserted relative to the preceding line.717% And a page break here is fine.718\vtop to #1\mil{\strut\vfil}%719%720% TeX does not even consider page breaks if a penalty added to the721% main vertical list is 10000 or more. But in order to see if the722% empty box we just added fits on the page, we must make it consider723% page breaks. On the other hand, we don't want to actually break the724% page after the empty box. So we use a penalty of 9999.725%726% There is an extremely small chance that TeX will actually break the727% page at this \penalty, if there are no other feasible breakpoints in728% sight. (If the user is using lots of big @group commands, which729% almost-but-not-quite fill up a page, TeX will have a hard time doing730% good page breaking, for example.) However, I could not construct an731% example where a page broke at this \penalty; if it happens in a real732% document, then we can reconsider our strategy.733\penalty9999734%735% Back up by the size of the box, whether we did a page break or not.736\kern -#1\mil737%738% Do not allow a page break right after this kern.739\nobreak740\fi741}742743% @br forces paragraph break (and is undocumented).744745\let\br = \par746747% @page forces the start of a new page.748%749\def\page{\par\vfill\supereject}750751% @exdent text....752% outputs text on separate line in roman font, starting at standard page margin753754% This records the amount of indent in the innermost environment.755% That's how much \exdent should take out.756\newskip\exdentamount757758% This defn is used inside fill environments such as @defun.759\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}760761% This defn is used inside nofill environments such as @example.762\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount763\leftline{\hskip\leftskip{\rm#1}}}}764765% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current766% paragraph. For more general purposes, use the \margin insertion767% class. WHICH is `l' or `r'. Not documented, written for gawk manual.768%769\newskip\inmarginspacing \inmarginspacing=1cm770\def\strutdepth{\dp\strutbox}771%772\def\doinmargin#1#2{\strut\vadjust{%773\nobreak774\kern-\strutdepth775\vtop to \strutdepth{%776\baselineskip=\strutdepth777\vss778% if you have multiple lines of stuff to put here, you'll need to779% make the vbox yourself of the appropriate size.780\ifx#1l%781\llap{\ignorespaces #2\hskip\inmarginspacing}%782\else783\rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%784\fi785\null786}%787}}788\def\inleftmargin{\doinmargin l}789\def\inrightmargin{\doinmargin r}790%791% @inmargin{TEXT [, RIGHT-TEXT]}792% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;793% else use TEXT for both).794%795\def\inmargin#1{\parseinmargin #1,,\finish}796\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.797\setbox0 = \hbox{\ignorespaces #2}%798\ifdim\wd0 > 0pt799\def\lefttext{#1}% have both texts800\def\righttext{#2}%801\else802\def\lefttext{#1}% have only one text803\def\righttext{#1}%804\fi805%806\ifodd\pageno807\def\temp{\inrightmargin\righttext}% odd page -> outside is right margin808\else809\def\temp{\inleftmargin\lefttext}%810\fi811\temp812}813814% @| inserts a changebar to the left of the current line. It should815% surround any changed text. This approach does *not* work if the816% change spans more than two lines of output. To handle that, we would817% have adopt a much more difficult approach (putting marks into the main818% vertical list for the beginning and end of each change). This command819% is not documented, not supported, and doesn't work.820%821\def\|{%822% \vadjust can only be used in horizontal mode.823\leavevmode824%825% Append this vertical mode material after the current line in the output.826\vadjust{%827% We want to insert a rule with the height and depth of the current828% leading; that is exactly what \strutbox is supposed to record.829\vskip-\baselineskip830%831% \vadjust-items are inserted at the left edge of the type. So832% the \llap here moves out into the left-hand margin.833\llap{%834%835% For a thicker or thinner bar, change the `1pt'.836\vrule height\baselineskip width1pt837%838% This is the space between the bar and the text.839\hskip 12pt840}%841}%842}843844% @include FILE -- \input text of FILE.845%846\def\include{\parseargusing\filenamecatcodes\includezzz}847\def\includezzz#1{%848\pushthisfilestack849\def\thisfile{#1}%850{%851\makevalueexpandable % we want to expand any @value in FILE.852\turnoffactive % and allow special characters in the expansion853\indexnofonts % Allow `@@' and other weird things in file names.854\wlog{texinfo.tex: doing @include of #1^^J}%855\edef\temp{\noexpand\input #1 }%856%857% This trickery is to read FILE outside of a group, in case it makes858% definitions, etc.859\expandafter860}\temp861\popthisfilestack862}863\def\filenamecatcodes{%864\catcode`\\=\other865\catcode`~=\other866\catcode`^=\other867\catcode`_=\other868\catcode`|=\other869\catcode`<=\other870\catcode`>=\other871\catcode`+=\other872\catcode`-=\other873\catcode`\`=\other874\catcode`\'=\other875}876877\def\pushthisfilestack{%878\expandafter\pushthisfilestackX\popthisfilestack\StackTerm879}880\def\pushthisfilestackX{%881\expandafter\pushthisfilestackY\thisfile\StackTerm882}883\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%884\gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%885}886887\def\popthisfilestack{\errthisfilestackempty}888\def\errthisfilestackempty{\errmessage{Internal error:889the stack of filenames is empty.}}890%891\def\thisfile{}892893% @center line894% outputs that line, centered.895%896\parseargdef\center{%897\ifhmode898\let\centersub\centerH899\else900\let\centersub\centerV901\fi902\centersub{\hfil \ignorespaces#1\unskip \hfil}%903\let\centersub\relax % don't let the definition persist, just in case904}905\def\centerH#1{{%906\hfil\break907\advance\hsize by -\leftskip908\advance\hsize by -\rightskip909\line{#1}%910\break911}}912%913\newcount\centerpenalty914\def\centerV#1{%915% The idea here is the same as in \startdefun, \cartouche, etc.: if916% @center is the first thing after a section heading, we need to wipe917% out the negative parskip inserted by \sectionheading, but still918% prevent a page break here.919\centerpenalty = \lastpenalty920\ifnum\centerpenalty>10000 \vskip\parskip \fi921\ifnum\centerpenalty>9999 \penalty\centerpenalty \fi922\line{\kern\leftskip #1\kern\rightskip}%923}924925% @sp n outputs n lines of vertical space926%927\parseargdef\sp{\vskip #1\baselineskip}928929% @comment ...line which is ignored...930% @c is the same as @comment931% @ignore ... @end ignore is another way to write a comment932%933\def\comment{\begingroup \catcode`\^^M=\other%934\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%935\commentxxx}936{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}937%938\let\c=\comment939940% @paragraphindent NCHARS941% We'll use ems for NCHARS, close enough.942% NCHARS can also be the word `asis' or `none'.943% We cannot feasibly implement @paragraphindent asis, though.944%945\def\asisword{asis} % no translation, these are keywords946\def\noneword{none}947%948\parseargdef\paragraphindent{%949\def\temp{#1}%950\ifx\temp\asisword951\else952\ifx\temp\noneword953\defaultparindent = 0pt954\else955\defaultparindent = #1em956\fi957\fi958\parindent = \defaultparindent959}960961% @exampleindent NCHARS962% We'll use ems for NCHARS like @paragraphindent.963% It seems @exampleindent asis isn't necessary, but964% I preserve it to make it similar to @paragraphindent.965\parseargdef\exampleindent{%966\def\temp{#1}%967\ifx\temp\asisword968\else969\ifx\temp\noneword970\lispnarrowing = 0pt971\else972\lispnarrowing = #1em973\fi974\fi975}976977% @firstparagraphindent WORD978% If WORD is `none', then suppress indentation of the first paragraph979% after a section heading. If WORD is `insert', then do indent at such980% paragraphs.981%982% The paragraph indentation is suppressed or not by calling983% \suppressfirstparagraphindent, which the sectioning commands do.984% We switch the definition of this back and forth according to WORD.985% By default, we suppress indentation.986%987\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}988\def\insertword{insert}989%990\parseargdef\firstparagraphindent{%991\def\temp{#1}%992\ifx\temp\noneword993\let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent994\else\ifx\temp\insertword995\let\suppressfirstparagraphindent = \relax996\else997\errhelp = \EMsimple998\errmessage{Unknown @firstparagraphindent option `\temp'}%999\fi\fi1000}10011002% Here is how we actually suppress indentation. Redefine \everypar to1003% \kern backwards by \parindent, and then reset itself to empty.1004%1005% We also make \indent itself not actually do anything until the next1006% paragraph.1007%1008\gdef\dosuppressfirstparagraphindent{%1009\gdef\indent{%1010\restorefirstparagraphindent1011\indent1012}%1013\gdef\noindent{%1014\restorefirstparagraphindent1015\noindent1016}%1017\global\everypar = {%1018\kern -\parindent1019\restorefirstparagraphindent1020}%1021}10221023\gdef\restorefirstparagraphindent{%1024\global \let \indent = \ptexindent1025\global \let \noindent = \ptexnoindent1026\global \everypar = {}%1027}102810291030% @refill is a no-op.1031\let\refill=\relax10321033% If working on a large document in chapters, it is convenient to1034% be able to disable indexing, cross-referencing, and contents, for test runs.1035% This is done with @novalidate (before @setfilename).1036%1037\newif\iflinks \linkstrue % by default we want the aux files.1038\let\novalidate = \linksfalse10391040% @setfilename is done at the beginning of every texinfo file.1041% So open here the files we need to have open while reading the input.1042% This makes it possible to make a .fmt file for texinfo.1043\def\setfilename{%1044\fixbackslash % Turn off hack to swallow `\input texinfo'.1045\iflinks1046\tryauxfile1047% Open the new aux file. TeX will close it automatically at exit.1048\immediate\openout\auxfile=\jobname.aux1049\fi % \openindices needs to do some work in any case.1050\openindices1051\let\setfilename=\comment % Ignore extra @setfilename cmds.1052%1053% If texinfo.cnf is present on the system, read it.1054% Useful for site-wide @afourpaper, etc.1055\openin 1 texinfo.cnf1056\ifeof 1 \else \input texinfo.cnf \fi1057\closein 11058%1059\comment % Ignore the actual filename.1060}10611062% Called from \setfilename.1063%1064\def\openindices{%1065\newindex{cp}%1066\newcodeindex{fn}%1067\newcodeindex{vr}%1068\newcodeindex{tp}%1069\newcodeindex{ky}%1070\newcodeindex{pg}%1071}10721073% @bye.1074\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}107510761077\message{pdf,}1078% adobe `portable' document format1079\newcount\tempnum1080\newcount\lnkcount1081\newtoks\filename1082\newcount\filenamelength1083\newcount\pgn1084\newtoks\toksA1085\newtoks\toksB1086\newtoks\toksC1087\newtoks\toksD1088\newbox\boxA1089\newcount\countA1090\newif\ifpdf1091\newif\ifpdfmakepagedest10921093% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=11094% can be set). So we test for \relax and 0 as well as being undefined.1095\ifx\pdfoutput\thisisundefined1096\else1097\ifx\pdfoutput\relax1098\else1099\ifcase\pdfoutput1100\else1101\pdftrue1102\fi1103\fi1104\fi11051106% PDF uses PostScript string constants for the names of xref targets,1107% for display in the outlines, and in other places. Thus, we have to1108% double any backslashes. Otherwise, a name like "\node" will be1109% interpreted as a newline (\n), followed by o, d, e. Not good.1110%1111% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and1112% related messages. The final outcome is that it is up to the TeX user1113% to double the backslashes and otherwise make the string valid, so1114% that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to1115% do this reliably, so we use it.11161117% #1 is a control sequence in which to do the replacements,1118% which we \xdef.1119\def\txiescapepdf#1{%1120\ifx\pdfescapestring\thisisundefined1121% No primitive available; should we give a warning or log?1122% Many times it won't matter.1123\else1124% The expandable \pdfescapestring primitive escapes parentheses,1125% backslashes, and other special chars.1126\xdef#1{\pdfescapestring{#1}}%1127\fi1128}11291130\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images1131with PDF output, and none of those formats could be found. (.eps cannot1132be supported due to the design of the PDF format; use regular TeX (DVI1133output) for that.)}11341135\ifpdf1136%1137% Color manipulation macros based on pdfcolor.tex,1138% except using rgb instead of cmyk; the latter is said to render as a1139% very dark gray on-screen and a very dark halftone in print, instead1140% of actual black.1141\def\rgbDarkRed{0.50 0.09 0.12}1142\def\rgbBlack{0 0 0}1143%1144% k sets the color for filling (usual text, etc.);1145% K sets the color for stroking (thin rules, e.g., normal _'s).1146\def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}}1147%1148% Set color, and create a mark which defines \thiscolor accordingly,1149% so that \makeheadline knows which color to restore.1150\def\setcolor#1{%1151\xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%1152\domark1153\pdfsetcolor{#1}%1154}1155%1156\def\maincolor{\rgbBlack}1157\pdfsetcolor{\maincolor}1158\edef\thiscolor{\maincolor}1159\def\lastcolordefs{}1160%1161\def\makefootline{%1162\baselineskip24pt1163\line{\pdfsetcolor{\maincolor}\the\footline}%1164}1165%1166\def\makeheadline{%1167\vbox to 0pt{%1168\vskip-22.5pt1169\line{%1170\vbox to8.5pt{}%1171% Extract \thiscolor definition from the marks.1172\getcolormarks1173% Typeset the headline with \maincolor, then restore the color.1174\pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%1175}%1176\vss1177}%1178\nointerlineskip1179}1180%1181%1182\pdfcatalog{/PageMode /UseOutlines}1183%1184% #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).1185\def\dopdfimage#1#2#3{%1186\def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%1187\def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%1188%1189% pdftex (and the PDF format) support .pdf, .png, .jpg (among1190% others). Let's try in that order, PDF first since if1191% someone has a scalable image, presumably better to use that than a1192% bitmap.1193\let\pdfimgext=\empty1194\begingroup1195\openin 1 #1.pdf \ifeof 11196\openin 1 #1.PDF \ifeof 11197\openin 1 #1.png \ifeof 11198\openin 1 #1.jpg \ifeof 11199\openin 1 #1.jpeg \ifeof 11200\openin 1 #1.JPG \ifeof 11201\errhelp = \nopdfimagehelp1202\errmessage{Could not find image file #1 for pdf}%1203\else \gdef\pdfimgext{JPG}%1204\fi1205\else \gdef\pdfimgext{jpeg}%1206\fi1207\else \gdef\pdfimgext{jpg}%1208\fi1209\else \gdef\pdfimgext{png}%1210\fi1211\else \gdef\pdfimgext{PDF}%1212\fi1213\else \gdef\pdfimgext{pdf}%1214\fi1215\closein 11216\endgroup1217%1218% without \immediate, ancient pdftex seg faults when the same image is1219% included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)1220\ifnum\pdftexversion < 141221\immediate\pdfimage1222\else1223\immediate\pdfximage1224\fi1225\ifdim \wd0 >0pt width \pdfimagewidth \fi1226\ifdim \wd2 >0pt height \pdfimageheight \fi1227\ifnum\pdftexversion<131228#1.\pdfimgext1229\else1230{#1.\pdfimgext}%1231\fi1232\ifnum\pdftexversion < 14 \else1233\pdfrefximage \pdflastximage1234\fi}1235%1236\def\pdfmkdest#1{{%1237% We have to set dummies so commands such as @code, and characters1238% such as \, aren't expanded when present in a section title.1239\indexnofonts1240\turnoffactive1241\makevalueexpandable1242\def\pdfdestname{#1}%1243\txiescapepdf\pdfdestname1244\safewhatsit{\pdfdest name{\pdfdestname} xyz}%1245}}1246%1247% used to mark target names; must be expandable.1248\def\pdfmkpgn#1{#1}1249%1250% by default, use a color that is dark enough to print on paper as1251% nearly black, but still distinguishable for online viewing.1252\def\urlcolor{\rgbDarkRed}1253\def\linkcolor{\rgbDarkRed}1254\def\endlink{\setcolor{\maincolor}\pdfendlink}1255%1256% Adding outlines to PDF; macros for calculating structure of outlines1257% come from Petr Olsak1258\def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%1259\else \csname#1\endcsname \fi}1260\def\advancenumber#1{\tempnum=\expnumber{#1}\relax1261\advance\tempnum by 11262\expandafter\xdef\csname#1\endcsname{\the\tempnum}}1263%1264% #1 is the section text, which is what will be displayed in the1265% outline by the pdf viewer. #2 is the pdf expression for the number1266% of subentries (or empty, for subsubsections). #3 is the node text,1267% which might be empty if this toc entry had no corresponding node.1268% #4 is the page number1269%1270\def\dopdfoutline#1#2#3#4{%1271% Generate a link to the node text if that exists; else, use the1272% page number. We could generate a destination for the section1273% text in the case where a section has no node, but it doesn't1274% seem worth the trouble, since most documents are normally structured.1275\edef\pdfoutlinedest{#3}%1276\ifx\pdfoutlinedest\empty1277\def\pdfoutlinedest{#4}%1278\else1279\txiescapepdf\pdfoutlinedest1280\fi1281%1282% Also escape PDF chars in the display string.1283\edef\pdfoutlinetext{#1}%1284\txiescapepdf\pdfoutlinetext1285%1286\pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%1287}1288%1289\def\pdfmakeoutlines{%1290\begingroup1291% Read toc silently, to get counts of subentries for \pdfoutline.1292\def\partentry##1##2##3##4{}% ignore parts in the outlines1293\def\numchapentry##1##2##3##4{%1294\def\thischapnum{##2}%1295\def\thissecnum{0}%1296\def\thissubsecnum{0}%1297}%1298\def\numsecentry##1##2##3##4{%1299\advancenumber{chap\thischapnum}%1300\def\thissecnum{##2}%1301\def\thissubsecnum{0}%1302}%1303\def\numsubsecentry##1##2##3##4{%1304\advancenumber{sec\thissecnum}%1305\def\thissubsecnum{##2}%1306}%1307\def\numsubsubsecentry##1##2##3##4{%1308\advancenumber{subsec\thissubsecnum}%1309}%1310\def\thischapnum{0}%1311\def\thissecnum{0}%1312\def\thissubsecnum{0}%1313%1314% use \def rather than \let here because we redefine \chapentry et1315% al. a second time, below.1316\def\appentry{\numchapentry}%1317\def\appsecentry{\numsecentry}%1318\def\appsubsecentry{\numsubsecentry}%1319\def\appsubsubsecentry{\numsubsubsecentry}%1320\def\unnchapentry{\numchapentry}%1321\def\unnsecentry{\numsecentry}%1322\def\unnsubsecentry{\numsubsecentry}%1323\def\unnsubsubsecentry{\numsubsubsecentry}%1324\readdatafile{toc}%1325%1326% Read toc second time, this time actually producing the outlines.1327% The `-' means take the \expnumber as the absolute number of1328% subentries, which we calculated on our first read of the .toc above.1329%1330% We use the node names as the destinations.1331\def\numchapentry##1##2##3##4{%1332\dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%1333\def\numsecentry##1##2##3##4{%1334\dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%1335\def\numsubsecentry##1##2##3##4{%1336\dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%1337\def\numsubsubsecentry##1##2##3##4{% count is always zero1338\dopdfoutline{##1}{}{##3}{##4}}%1339%1340% PDF outlines are displayed using system fonts, instead of1341% document fonts. Therefore we cannot use special characters,1342% since the encoding is unknown. For example, the eogonek from1343% Latin 2 (0xea) gets translated to a | character. Info from1344% Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.1345%1346% TODO this right, we have to translate 8-bit characters to1347% their "best" equivalent, based on the @documentencoding. Too1348% much work for too little return. Just use the ASCII equivalents1349% we use for the index sort strings.1350%1351\indexnofonts1352\setupdatafile1353% We can have normal brace characters in the PDF outlines, unlike1354% Texinfo index files. So set that up.1355\def\{{\lbracecharliteral}%1356\def\}{\rbracecharliteral}%1357\catcode`\\=\active \otherbackslash1358\input \tocreadfilename1359\endgroup1360}1361{\catcode`[=1 \catcode`]=21362\catcode`{=\other \catcode`}=\other1363\gdef\lbracecharliteral[{]%1364\gdef\rbracecharliteral[}]%1365]1366%1367\def\skipspaces#1{\def\PP{#1}\def\D{|}%1368\ifx\PP\D\let\nextsp\relax1369\else\let\nextsp\skipspaces1370\addtokens{\filename}{\PP}%1371\advance\filenamelength by 11372\fi1373\nextsp}1374\def\getfilename#1{%1375\filenamelength=01376% If we don't expand the argument now, \skipspaces will get1377% snagged on things like "@value{foo}".1378\edef\temp{#1}%1379\expandafter\skipspaces\temp|\relax1380}1381\ifnum\pdftexversion < 141382\let \startlink \pdfannotlink1383\else1384\let \startlink \pdfstartlink1385\fi1386% make a live url in pdf output.1387\def\pdfurl#1{%1388\begingroup1389% it seems we really need yet another set of dummies; have not1390% tried to figure out what each command should do in the context1391% of @url. for now, just make @/ a no-op, that's the only one1392% people have actually reported a problem with.1393%1394\normalturnoffactive1395\def\@{@}%1396\let\/=\empty1397\makevalueexpandable1398% do we want to go so far as to use \indexnofonts instead of just1399% special-casing \var here?1400\def\var##1{##1}%1401%1402\leavevmode\setcolor{\urlcolor}%1403\startlink attr{/Border [0 0 0]}%1404user{/Subtype /Link /A << /S /URI /URI (#1) >>}%1405\endgroup}1406\def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}1407\def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}1408\def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}1409\def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}1410\def\maketoks{%1411\expandafter\poptoks\the\toksA|ENDTOKS|\relax1412\ifx\first0\adn01413\else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn31414\else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn61415\else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn91416\else1417\ifnum0=\countA\else\makelink\fi1418\ifx\first.\let\next=\done\else1419\let\next=\maketoks1420\addtokens{\toksB}{\the\toksD}1421\ifx\first,\addtokens{\toksB}{\space}\fi1422\fi1423\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi1424\next}1425\def\makelink{\addtokens{\toksB}%1426{\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}1427\def\pdflink#1{%1428\startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}1429\setcolor{\linkcolor}#1\endlink}1430\def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}1431\else1432% non-pdf mode1433\let\pdfmkdest = \gobble1434\let\pdfurl = \gobble1435\let\endlink = \relax1436\let\setcolor = \gobble1437\let\pdfsetcolor = \gobble1438\let\pdfmakeoutlines = \relax1439\fi % \ifx\pdfoutput144014411442\message{fonts,}14431444% Change the current font style to #1, remembering it in \curfontstyle.1445% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in1446% italics, not bold italics.1447%1448\def\setfontstyle#1{%1449\def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.1450\csname ten#1\endcsname % change the current font1451}14521453% Select #1 fonts with the current style.1454%1455\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}14561457\def\rm{\fam=0 \setfontstyle{rm}}1458\def\it{\fam=\itfam \setfontstyle{it}}1459\def\sl{\fam=\slfam \setfontstyle{sl}}1460\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}1461\def\tt{\fam=\ttfam \setfontstyle{tt}}14621463% Unfortunately, we have to override this for titles and the like, since1464% in those cases "rm" is bold. Sigh.1465\def\rmisbold{\rm\def\curfontstyle{bf}}14661467% Texinfo sort of supports the sans serif font style, which plain TeX does not.1468% So we set up a \sf.1469\newfam\sffam1470\def\sf{\fam=\sffam \setfontstyle{sf}}1471\let\li = \sf % Sometimes we call it \li, not \sf.14721473% We don't need math for this font style.1474\def\ttsl{\setfontstyle{ttsl}}147514761477% Set the baselineskip to #1, and the lineskip and strut size1478% correspondingly. There is no deep meaning behind these magic numbers1479% used as factors; they just match (closely enough) what Knuth defined.1480%1481\def\lineskipfactor{.08333}1482\def\strutheightpercent{.70833}1483\def\strutdepthpercent {.29167}1484%1485% can get a sort of poor man's double spacing by redefining this.1486\def\baselinefactor{1}1487%1488\newdimen\textleading1489\def\setleading#1{%1490\dimen0 = #1\relax1491\normalbaselineskip = \baselinefactor\dimen01492\normallineskip = \lineskipfactor\normalbaselineskip1493\normalbaselines1494\setbox\strutbox =\hbox{%1495\vrule width0pt height\strutheightpercent\baselineskip1496depth \strutdepthpercent \baselineskip1497}%1498}14991500% PDF CMaps. See also LaTeX's t1.cmap.1501%1502% do nothing with this by default.1503\expandafter\let\csname cmapOT1\endcsname\gobble1504\expandafter\let\csname cmapOT1IT\endcsname\gobble1505\expandafter\let\csname cmapOT1TT\endcsname\gobble15061507% if we are producing pdf, and we have \pdffontattr, then define cmaps.1508% (\pdffontattr was introduced many years ago, but people still run1509% older pdftex's; it's easy to conditionalize, so we do.)1510\ifpdf \ifx\pdffontattr\thisisundefined \else1511\begingroup1512\catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.1513\catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap1514%%DocumentNeededResources: ProcSet (CIDInit)1515%%IncludeResource: ProcSet (CIDInit)1516%%BeginResource: CMap (TeX-OT1-0)1517%%Title: (TeX-OT1-0 TeX OT1 0)1518%%Version: 1.0001519%%EndComments1520/CIDInit /ProcSet findresource begin152112 dict begin1522begincmap1523/CIDSystemInfo1524<< /Registry (TeX)1525/Ordering (OT1)1526/Supplement 01527>> def1528/CMapName /TeX-OT1-0 def1529/CMapType 2 def15301 begincodespacerange1531<00> <7F>1532endcodespacerange15338 beginbfrange1534<00> <01> <0393>1535<09> <0A> <03A8>1536<23> <26> <0023>1537<28> <3B> <0028>1538<3F> <5B> <003F>1539<5D> <5E> <005D>1540<61> <7A> <0061>1541<7B> <7C> <2013>1542endbfrange154340 beginbfchar1544<02> <0398>1545<03> <039B>1546<04> <039E>1547<05> <03A0>1548<06> <03A3>1549<07> <03D2>1550<08> <03A6>1551<0B> <00660066>1552<0C> <00660069>1553<0D> <0066006C>1554<0E> <006600660069>1555<0F> <00660066006C>1556<10> <0131>1557<11> <0237>1558<12> <0060>1559<13> <00B4>1560<14> <02C7>1561<15> <02D8>1562<16> <00AF>1563<17> <02DA>1564<18> <00B8>1565<19> <00DF>1566<1A> <00E6>1567<1B> <0153>1568<1C> <00F8>1569<1D> <00C6>1570<1E> <0152>1571<1F> <00D8>1572<21> <0021>1573<22> <201D>1574<27> <2019>1575<3C> <00A1>1576<3D> <003D>1577<3E> <00BF>1578<5C> <201C>1579<5F> <02D9>1580<60> <2018>1581<7D> <02DD>1582<7E> <007E>1583<7F> <00A8>1584endbfchar1585endcmap1586CMapName currentdict /CMap defineresource pop1587end1588end1589%%EndResource1590%%EOF1591}\endgroup1592\expandafter\edef\csname cmapOT1\endcsname#1{%1593\pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%1594}%1595%1596% \cmapOT1IT1597\begingroup1598\catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.1599\catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap1600%%DocumentNeededResources: ProcSet (CIDInit)1601%%IncludeResource: ProcSet (CIDInit)1602%%BeginResource: CMap (TeX-OT1IT-0)1603%%Title: (TeX-OT1IT-0 TeX OT1IT 0)1604%%Version: 1.0001605%%EndComments1606/CIDInit /ProcSet findresource begin160712 dict begin1608begincmap1609/CIDSystemInfo1610<< /Registry (TeX)1611/Ordering (OT1IT)1612/Supplement 01613>> def1614/CMapName /TeX-OT1IT-0 def1615/CMapType 2 def16161 begincodespacerange1617<00> <7F>1618endcodespacerange16198 beginbfrange1620<00> <01> <0393>1621<09> <0A> <03A8>1622<25> <26> <0025>1623<28> <3B> <0028>1624<3F> <5B> <003F>1625<5D> <5E> <005D>1626<61> <7A> <0061>1627<7B> <7C> <2013>1628endbfrange162942 beginbfchar1630<02> <0398>1631<03> <039B>1632<04> <039E>1633<05> <03A0>1634<06> <03A3>1635<07> <03D2>1636<08> <03A6>1637<0B> <00660066>1638<0C> <00660069>1639<0D> <0066006C>1640<0E> <006600660069>1641<0F> <00660066006C>1642<10> <0131>1643<11> <0237>1644<12> <0060>1645<13> <00B4>1646<14> <02C7>1647<15> <02D8>1648<16> <00AF>1649<17> <02DA>1650<18> <00B8>1651<19> <00DF>1652<1A> <00E6>1653<1B> <0153>1654<1C> <00F8>1655<1D> <00C6>1656<1E> <0152>1657<1F> <00D8>1658<21> <0021>1659<22> <201D>1660<23> <0023>1661<24> <00A3>1662<27> <2019>1663<3C> <00A1>1664<3D> <003D>1665<3E> <00BF>1666<5C> <201C>1667<5F> <02D9>1668<60> <2018>1669<7D> <02DD>1670<7E> <007E>1671<7F> <00A8>1672endbfchar1673endcmap1674CMapName currentdict /CMap defineresource pop1675end1676end1677%%EndResource1678%%EOF1679}\endgroup1680\expandafter\edef\csname cmapOT1IT\endcsname#1{%1681\pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%1682}%1683%1684% \cmapOT1TT1685\begingroup1686\catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.1687\catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap1688%%DocumentNeededResources: ProcSet (CIDInit)1689%%IncludeResource: ProcSet (CIDInit)1690%%BeginResource: CMap (TeX-OT1TT-0)1691%%Title: (TeX-OT1TT-0 TeX OT1TT 0)1692%%Version: 1.0001693%%EndComments1694/CIDInit /ProcSet findresource begin169512 dict begin1696begincmap1697/CIDSystemInfo1698<< /Registry (TeX)1699/Ordering (OT1TT)1700/Supplement 01701>> def1702/CMapName /TeX-OT1TT-0 def1703/CMapType 2 def17041 begincodespacerange1705<00> <7F>1706endcodespacerange17075 beginbfrange1708<00> <01> <0393>1709<09> <0A> <03A8>1710<21> <26> <0021>1711<28> <5F> <0028>1712<61> <7E> <0061>1713endbfrange171432 beginbfchar1715<02> <0398>1716<03> <039B>1717<04> <039E>1718<05> <03A0>1719<06> <03A3>1720<07> <03D2>1721<08> <03A6>1722<0B> <2191>1723<0C> <2193>1724<0D> <0027>1725<0E> <00A1>1726<0F> <00BF>1727<10> <0131>1728<11> <0237>1729<12> <0060>1730<13> <00B4>1731<14> <02C7>1732<15> <02D8>1733<16> <00AF>1734<17> <02DA>1735<18> <00B8>1736<19> <00DF>1737<1A> <00E6>1738<1B> <0153>1739<1C> <00F8>1740<1D> <00C6>1741<1E> <0152>1742<1F> <00D8>1743<20> <2423>1744<27> <2019>1745<60> <2018>1746<7F> <00A8>1747endbfchar1748endcmap1749CMapName currentdict /CMap defineresource pop1750end1751end1752%%EndResource1753%%EOF1754}\endgroup1755\expandafter\edef\csname cmapOT1TT\endcsname#1{%1756\pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%1757}%1758\fi\fi175917601761% Set the font macro #1 to the font named \fontprefix#2.1762% #3 is the font's design size, #4 is a scale factor, #5 is the CMap1763% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).1764% Example:1765% #1 = \textrm1766% #2 = \rmshape1767% #3 = 101768% #4 = \mainmagstep1769% #5 = OT11770%1771\def\setfont#1#2#3#4#5{%1772\font#1=\fontprefix#2#3 scaled #41773\csname cmap#5\endcsname#1%1774}1775% This is what gets called when #5 of \setfont is empty.1776\let\cmap\gobble1777%1778% (end of cmaps)17791780% Use cm as the default font prefix.1781% To specify the font prefix, you must define \fontprefix1782% before you read in texinfo.tex.1783\ifx\fontprefix\thisisundefined1784\def\fontprefix{cm}1785\fi1786% Support font families that don't use the same naming scheme as CM.1787\def\rmshape{r}1788\def\rmbshape{bx} % where the normal face is bold1789\def\bfshape{b}1790\def\bxshape{bx}1791\def\ttshape{tt}1792\def\ttbshape{tt}1793\def\ttslshape{sltt}1794\def\itshape{ti}1795\def\itbshape{bxti}1796\def\slshape{sl}1797\def\slbshape{bxsl}1798\def\sfshape{ss}1799\def\sfbshape{ss}1800\def\scshape{csc}1801\def\scbshape{csc}18021803% Definitions for a main text size of 11pt. (The default in Texinfo.)1804%1805\def\definetextfontsizexi{%1806% Text fonts (11.2pt, magstep1).1807\def\textnominalsize{11pt}1808\edef\mainmagstep{\magstephalf}1809\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}1810\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}1811\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}1812\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}1813\setfont\textsl\slshape{10}{\mainmagstep}{OT1}1814\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}1815\setfont\textsc\scshape{10}{\mainmagstep}{OT1}1816\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}1817\font\texti=cmmi10 scaled \mainmagstep1818\font\textsy=cmsy10 scaled \mainmagstep1819\def\textecsize{1095}18201821% A few fonts for @defun names and args.1822\setfont\defbf\bfshape{10}{\magstep1}{OT1}1823\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}1824\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}1825\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}18261827% Fonts for indices, footnotes, small examples (9pt).1828\def\smallnominalsize{9pt}1829\setfont\smallrm\rmshape{9}{1000}{OT1}1830\setfont\smalltt\ttshape{9}{1000}{OT1TT}1831\setfont\smallbf\bfshape{10}{900}{OT1}1832\setfont\smallit\itshape{9}{1000}{OT1IT}1833\setfont\smallsl\slshape{9}{1000}{OT1}1834\setfont\smallsf\sfshape{9}{1000}{OT1}1835\setfont\smallsc\scshape{10}{900}{OT1}1836\setfont\smallttsl\ttslshape{10}{900}{OT1TT}1837\font\smalli=cmmi91838\font\smallsy=cmsy91839\def\smallecsize{0900}18401841% Fonts for small examples (8pt).1842\def\smallernominalsize{8pt}1843\setfont\smallerrm\rmshape{8}{1000}{OT1}1844\setfont\smallertt\ttshape{8}{1000}{OT1TT}1845\setfont\smallerbf\bfshape{10}{800}{OT1}1846\setfont\smallerit\itshape{8}{1000}{OT1IT}1847\setfont\smallersl\slshape{8}{1000}{OT1}1848\setfont\smallersf\sfshape{8}{1000}{OT1}1849\setfont\smallersc\scshape{10}{800}{OT1}1850\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}1851\font\smalleri=cmmi81852\font\smallersy=cmsy81853\def\smallerecsize{0800}18541855% Fonts for title page (20.4pt):1856\def\titlenominalsize{20pt}1857\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}1858\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}1859\setfont\titlesl\slbshape{10}{\magstep4}{OT1}1860\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}1861\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}1862\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}1863\let\titlebf=\titlerm1864\setfont\titlesc\scbshape{10}{\magstep4}{OT1}1865\font\titlei=cmmi12 scaled \magstep31866\font\titlesy=cmsy10 scaled \magstep41867\def\titleecsize{2074}18681869% Chapter (and unnumbered) fonts (17.28pt).1870\def\chapnominalsize{17pt}1871\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}1872\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}1873\setfont\chapsl\slbshape{10}{\magstep3}{OT1}1874\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}1875\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}1876\setfont\chapsf\sfbshape{17}{1000}{OT1}1877\let\chapbf=\chaprm1878\setfont\chapsc\scbshape{10}{\magstep3}{OT1}1879\font\chapi=cmmi12 scaled \magstep21880\font\chapsy=cmsy10 scaled \magstep31881\def\chapecsize{1728}18821883% Section fonts (14.4pt).1884\def\secnominalsize{14pt}1885\setfont\secrm\rmbshape{12}{\magstep1}{OT1}1886\setfont\secit\itbshape{10}{\magstep2}{OT1IT}1887\setfont\secsl\slbshape{10}{\magstep2}{OT1}1888\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}1889\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}1890\setfont\secsf\sfbshape{12}{\magstep1}{OT1}1891\let\secbf\secrm1892\setfont\secsc\scbshape{10}{\magstep2}{OT1}1893\font\seci=cmmi12 scaled \magstep11894\font\secsy=cmsy10 scaled \magstep21895\def\sececsize{1440}18961897% Subsection fonts (13.15pt).1898\def\ssecnominalsize{13pt}1899\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}1900\setfont\ssecit\itbshape{10}{1315}{OT1IT}1901\setfont\ssecsl\slbshape{10}{1315}{OT1}1902\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}1903\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}1904\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}1905\let\ssecbf\ssecrm1906\setfont\ssecsc\scbshape{10}{1315}{OT1}1907\font\sseci=cmmi12 scaled \magstephalf1908\font\ssecsy=cmsy10 scaled 13151909\def\ssececsize{1200}19101911% Reduced fonts for @acro in text (10pt).1912\def\reducednominalsize{10pt}1913\setfont\reducedrm\rmshape{10}{1000}{OT1}1914\setfont\reducedtt\ttshape{10}{1000}{OT1TT}1915\setfont\reducedbf\bfshape{10}{1000}{OT1}1916\setfont\reducedit\itshape{10}{1000}{OT1IT}1917\setfont\reducedsl\slshape{10}{1000}{OT1}1918\setfont\reducedsf\sfshape{10}{1000}{OT1}1919\setfont\reducedsc\scshape{10}{1000}{OT1}1920\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}1921\font\reducedi=cmmi101922\font\reducedsy=cmsy101923\def\reducedecsize{1000}19241925\textleading = 13.2pt % line spacing for 11pt CM1926\textfonts % reset the current fonts1927\rm1928} % end of 11pt text font size definitions, \definetextfontsizexi192919301931% Definitions to make the main text be 10pt Computer Modern, with1932% section, chapter, etc., sizes following suit. This is for the GNU1933% Press printing of the Emacs 22 manual. Maybe other manuals in the1934% future. Used with @smallbook, which sets the leading to 12pt.1935%1936\def\definetextfontsizex{%1937% Text fonts (10pt).1938\def\textnominalsize{10pt}1939\edef\mainmagstep{1000}1940\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}1941\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}1942\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}1943\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}1944\setfont\textsl\slshape{10}{\mainmagstep}{OT1}1945\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}1946\setfont\textsc\scshape{10}{\mainmagstep}{OT1}1947\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}1948\font\texti=cmmi10 scaled \mainmagstep1949\font\textsy=cmsy10 scaled \mainmagstep1950\def\textecsize{1000}19511952% A few fonts for @defun names and args.1953\setfont\defbf\bfshape{10}{\magstephalf}{OT1}1954\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}1955\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}1956\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}19571958% Fonts for indices, footnotes, small examples (9pt).1959\def\smallnominalsize{9pt}1960\setfont\smallrm\rmshape{9}{1000}{OT1}1961\setfont\smalltt\ttshape{9}{1000}{OT1TT}1962\setfont\smallbf\bfshape{10}{900}{OT1}1963\setfont\smallit\itshape{9}{1000}{OT1IT}1964\setfont\smallsl\slshape{9}{1000}{OT1}1965\setfont\smallsf\sfshape{9}{1000}{OT1}1966\setfont\smallsc\scshape{10}{900}{OT1}1967\setfont\smallttsl\ttslshape{10}{900}{OT1TT}1968\font\smalli=cmmi91969\font\smallsy=cmsy91970\def\smallecsize{0900}19711972% Fonts for small examples (8pt).1973\def\smallernominalsize{8pt}1974\setfont\smallerrm\rmshape{8}{1000}{OT1}1975\setfont\smallertt\ttshape{8}{1000}{OT1TT}1976\setfont\smallerbf\bfshape{10}{800}{OT1}1977\setfont\smallerit\itshape{8}{1000}{OT1IT}1978\setfont\smallersl\slshape{8}{1000}{OT1}1979\setfont\smallersf\sfshape{8}{1000}{OT1}1980\setfont\smallersc\scshape{10}{800}{OT1}1981\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}1982\font\smalleri=cmmi81983\font\smallersy=cmsy81984\def\smallerecsize{0800}19851986% Fonts for title page (20.4pt):1987\def\titlenominalsize{20pt}1988\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}1989\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}1990\setfont\titlesl\slbshape{10}{\magstep4}{OT1}1991\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}1992\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}1993\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}1994\let\titlebf=\titlerm1995\setfont\titlesc\scbshape{10}{\magstep4}{OT1}1996\font\titlei=cmmi12 scaled \magstep31997\font\titlesy=cmsy10 scaled \magstep41998\def\titleecsize{2074}19992000% Chapter fonts (14.4pt).2001\def\chapnominalsize{14pt}2002\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}2003\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}2004\setfont\chapsl\slbshape{10}{\magstep2}{OT1}2005\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}2006\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}2007\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}2008\let\chapbf\chaprm2009\setfont\chapsc\scbshape{10}{\magstep2}{OT1}2010\font\chapi=cmmi12 scaled \magstep12011\font\chapsy=cmsy10 scaled \magstep22012\def\chapecsize{1440}20132014% Section fonts (12pt).2015\def\secnominalsize{12pt}2016\setfont\secrm\rmbshape{12}{1000}{OT1}2017\setfont\secit\itbshape{10}{\magstep1}{OT1IT}2018\setfont\secsl\slbshape{10}{\magstep1}{OT1}2019\setfont\sectt\ttbshape{12}{1000}{OT1TT}2020\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}2021\setfont\secsf\sfbshape{12}{1000}{OT1}2022\let\secbf\secrm2023\setfont\secsc\scbshape{10}{\magstep1}{OT1}2024\font\seci=cmmi122025\font\secsy=cmsy10 scaled \magstep12026\def\sececsize{1200}20272028% Subsection fonts (10pt).2029\def\ssecnominalsize{10pt}2030\setfont\ssecrm\rmbshape{10}{1000}{OT1}2031\setfont\ssecit\itbshape{10}{1000}{OT1IT}2032\setfont\ssecsl\slbshape{10}{1000}{OT1}2033\setfont\ssectt\ttbshape{10}{1000}{OT1TT}2034\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}2035\setfont\ssecsf\sfbshape{10}{1000}{OT1}2036\let\ssecbf\ssecrm2037\setfont\ssecsc\scbshape{10}{1000}{OT1}2038\font\sseci=cmmi102039\font\ssecsy=cmsy102040\def\ssececsize{1000}20412042% Reduced fonts for @acro in text (9pt).2043\def\reducednominalsize{9pt}2044\setfont\reducedrm\rmshape{9}{1000}{OT1}2045\setfont\reducedtt\ttshape{9}{1000}{OT1TT}2046\setfont\reducedbf\bfshape{10}{900}{OT1}2047\setfont\reducedit\itshape{9}{1000}{OT1IT}2048\setfont\reducedsl\slshape{9}{1000}{OT1}2049\setfont\reducedsf\sfshape{9}{1000}{OT1}2050\setfont\reducedsc\scshape{10}{900}{OT1}2051\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}2052\font\reducedi=cmmi92053\font\reducedsy=cmsy92054\def\reducedecsize{0900}20552056\divide\parskip by 2 % reduce space between paragraphs2057\textleading = 12pt % line spacing for 10pt CM2058\textfonts % reset the current fonts2059\rm2060} % end of 10pt text font size definitions, \definetextfontsizex206120622063% We provide the user-level command2064% @fonttextsize 102065% (or 11) to redefine the text font size. pt is assumed.2066%2067\def\xiword{11}2068\def\xword{10}2069\def\xwordpt{10pt}2070%2071\parseargdef\fonttextsize{%2072\def\textsizearg{#1}%2073%\wlog{doing @fonttextsize \textsizearg}%2074%2075% Set \globaldefs so that documents can use this inside @tex, since2076% makeinfo 4.8 does not support it, but we need it nonetheless.2077%2078\begingroup \globaldefs=12079\ifx\textsizearg\xword \definetextfontsizex2080\else \ifx\textsizearg\xiword \definetextfontsizexi2081\else2082\errhelp=\EMsimple2083\errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}2084\fi\fi2085\endgroup2086}208720882089% In order for the font changes to affect most math symbols and letters,2090% we have to define the \textfont of the standard families. Since2091% texinfo doesn't allow for producing subscripts and superscripts except2092% in the main text, we don't bother to reset \scriptfont and2093% \scriptscriptfont (which would also require loading a lot more fonts).2094%2095\def\resetmathfonts{%2096\textfont0=\tenrm \textfont1=\teni \textfont2=\tensy2097\textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf2098\textfont\ttfam=\tentt \textfont\sffam=\tensf2099}21002101% The font-changing commands redefine the meanings of \tenSTYLE, instead2102% of just \STYLE. We do this because \STYLE needs to also set the2103% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire2104% \tenSTYLE to set the current font.2105%2106% Each font-changing command also sets the names \lsize (one size lower)2107% and \lllsize (three sizes lower). These relative commands are used in2108% the LaTeX logo and acronyms.2109%2110% This all needs generalizing, badly.2111%2112\def\textfonts{%2113\let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl2114\let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc2115\let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy2116\let\tenttsl=\textttsl2117\def\curfontsize{text}%2118\def\lsize{reduced}\def\lllsize{smaller}%2119\resetmathfonts \setleading{\textleading}}2120\def\titlefonts{%2121\let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl2122\let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc2123\let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy2124\let\tenttsl=\titlettsl2125\def\curfontsize{title}%2126\def\lsize{chap}\def\lllsize{subsec}%2127\resetmathfonts \setleading{27pt}}2128\def\titlefont#1{{\titlefonts\rmisbold #1}}2129\def\chapfonts{%2130\let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl2131\let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc2132\let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy2133\let\tenttsl=\chapttsl2134\def\curfontsize{chap}%2135\def\lsize{sec}\def\lllsize{text}%2136\resetmathfonts \setleading{19pt}}2137\def\secfonts{%2138\let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl2139\let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc2140\let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy2141\let\tenttsl=\secttsl2142\def\curfontsize{sec}%2143\def\lsize{subsec}\def\lllsize{reduced}%2144\resetmathfonts \setleading{16pt}}2145\def\subsecfonts{%2146\let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl2147\let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc2148\let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy2149\let\tenttsl=\ssecttsl2150\def\curfontsize{ssec}%2151\def\lsize{text}\def\lllsize{small}%2152\resetmathfonts \setleading{15pt}}2153\let\subsubsecfonts = \subsecfonts2154\def\reducedfonts{%2155\let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl2156\let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc2157\let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy2158\let\tenttsl=\reducedttsl2159\def\curfontsize{reduced}%2160\def\lsize{small}\def\lllsize{smaller}%2161\resetmathfonts \setleading{10.5pt}}2162\def\smallfonts{%2163\let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl2164\let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc2165\let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy2166\let\tenttsl=\smallttsl2167\def\curfontsize{small}%2168\def\lsize{smaller}\def\lllsize{smaller}%2169\resetmathfonts \setleading{10.5pt}}2170\def\smallerfonts{%2171\let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl2172\let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc2173\let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy2174\let\tenttsl=\smallerttsl2175\def\curfontsize{smaller}%2176\def\lsize{smaller}\def\lllsize{smaller}%2177\resetmathfonts \setleading{9.5pt}}21782179% Fonts for short table of contents.2180\setfont\shortcontrm\rmshape{12}{1000}{OT1}2181\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb122182\setfont\shortcontsl\slshape{12}{1000}{OT1}2183\setfont\shortconttt\ttshape{12}{1000}{OT1TT}21842185% Define these just so they can be easily changed for other fonts.2186\def\angleleft{$\langle$}2187\def\angleright{$\rangle$}21882189% Set the fonts to use with the @small... environments.2190\let\smallexamplefonts = \smallfonts21912192% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample2193% can fit this many characters:2194% 8.5x11=86 smallbook=72 a4=90 a5=692195% If we use \scriptfonts (8pt), then we can fit this many characters:2196% 8.5x11=90+ smallbook=80 a4=90+ a5=772197% For me, subjectively, the few extra characters that fit aren't worth2198% the additional smallness of 8pt. So I'm making the default 9pt.2199%2200% By the way, for comparison, here's what fits with @example (10pt):2201% 8.5x11=71 smallbook=60 a4=75 a5=582202% --karl, 24jan03.22032204% Set up the default fonts, so we can use them for creating boxes.2205%2206\definetextfontsizexi220722082209\message{markup,}22102211% Check if we are currently using a typewriter font. Since all the2212% Computer Modern typewriter fonts have zero interword stretch (and2213% shrink), and it is reasonable to expect all typewriter fonts to have2214% this property, we can check that font parameter.2215%2216\def\ifmonospace{\ifdim\fontdimen3\font=0pt }22172218% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will2219% define and register \INITMACRO to be called on markup style changes.2220% \INITMACRO can check \currentmarkupstyle for the innermost2221% style and the set of \ifmarkupSTYLE switches for all styles2222% currently in effect.2223\newif\ifmarkupvar2224\newif\ifmarkupsamp2225\newif\ifmarkupkey2226%\newif\ifmarkupfile % @file == @samp.2227%\newif\ifmarkupoption % @option == @samp.2228\newif\ifmarkupcode2229\newif\ifmarkupkbd2230%\newif\ifmarkupenv % @env == @code.2231%\newif\ifmarkupcommand % @command == @code.2232\newif\ifmarkuptex % @tex (and part of @math, for now).2233\newif\ifmarkupexample2234\newif\ifmarkupverb2235\newif\ifmarkupverbatim22362237\let\currentmarkupstyle\empty22382239\def\setupmarkupstyle#1{%2240\csname markup#1true\endcsname2241\def\currentmarkupstyle{#1}%2242\markupstylesetup2243}22442245\let\markupstylesetup\empty22462247\def\defmarkupstylesetup#1{%2248\expandafter\def\expandafter\markupstylesetup2249\expandafter{\markupstylesetup #1}%2250\def#1%2251}22522253% Markup style setup for left and right quotes.2254\defmarkupstylesetup\markupsetuplq{%2255\expandafter\let\expandafter \temp2256\csname markupsetuplq\currentmarkupstyle\endcsname2257\ifx\temp\relax \markupsetuplqdefault \else \temp \fi2258}22592260\defmarkupstylesetup\markupsetuprq{%2261\expandafter\let\expandafter \temp2262\csname markupsetuprq\currentmarkupstyle\endcsname2263\ifx\temp\relax \markupsetuprqdefault \else \temp \fi2264}22652266{2267\catcode`\'=\active2268\catcode`\`=\active22692270\gdef\markupsetuplqdefault{\let`\lq}2271\gdef\markupsetuprqdefault{\let'\rq}22722273\gdef\markupsetcodequoteleft{\let`\codequoteleft}2274\gdef\markupsetcodequoteright{\let'\codequoteright}2275}22762277\let\markupsetuplqcode \markupsetcodequoteleft2278\let\markupsetuprqcode \markupsetcodequoteright2279%2280\let\markupsetuplqexample \markupsetcodequoteleft2281\let\markupsetuprqexample \markupsetcodequoteright2282%2283\let\markupsetuplqkbd \markupsetcodequoteleft2284\let\markupsetuprqkbd \markupsetcodequoteright2285%2286\let\markupsetuplqsamp \markupsetcodequoteleft2287\let\markupsetuprqsamp \markupsetcodequoteright2288%2289\let\markupsetuplqverb \markupsetcodequoteleft2290\let\markupsetuprqverb \markupsetcodequoteright2291%2292\let\markupsetuplqverbatim \markupsetcodequoteleft2293\let\markupsetuprqverbatim \markupsetcodequoteright22942295% Allow an option to not use regular directed right quote/apostrophe2296% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).2297% The undirected quote is ugly, so don't make it the default, but it2298% works for pasting with more pdf viewers (at least evince), the2299% lilypond developers report. xpdf does work with the regular 0x27.2300%2301\def\codequoteright{%2302\expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax2303\expandafter\ifx\csname SETcodequoteundirected\endcsname\relax2304'%2305\else \char'15 \fi2306\else \char'15 \fi2307}2308%2309% and a similar option for the left quote char vs. a grave accent.2310% Modern fonts display ASCII 0x60 as a grave accent, so some people like2311% the code environments to do likewise.2312%2313\def\codequoteleft{%2314\expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax2315\expandafter\ifx\csname SETcodequotebacktick\endcsname\relax2316% [Knuth] pp. 380,381,3912317% \relax disables Spanish ligatures ?` and !` of \tt font.2318\relax`%2319\else \char'22 \fi2320\else \char'22 \fi2321}23222323% Commands to set the quote options.2324%2325\parseargdef\codequoteundirected{%2326\def\temp{#1}%2327\ifx\temp\onword2328\expandafter\let\csname SETtxicodequoteundirected\endcsname2329= t%2330\else\ifx\temp\offword2331\expandafter\let\csname SETtxicodequoteundirected\endcsname2332= \relax2333\else2334\errhelp = \EMsimple2335\errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%2336\fi\fi2337}2338%2339\parseargdef\codequotebacktick{%2340\def\temp{#1}%2341\ifx\temp\onword2342\expandafter\let\csname SETtxicodequotebacktick\endcsname2343= t%2344\else\ifx\temp\offword2345\expandafter\let\csname SETtxicodequotebacktick\endcsname2346= \relax2347\else2348\errhelp = \EMsimple2349\errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%2350\fi\fi2351}23522353% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.2354\def\noligaturesquoteleft{\relax\lq}23552356% Count depth in font-changes, for error checks2357\newcount\fontdepth \fontdepth=023582359% Font commands.23602361% #1 is the font command (\sl or \it), #2 is the text to slant.2362% If we are in a monospaced environment, however, 1) always use \ttsl,2363% and 2) do not add an italic correction.2364\def\dosmartslant#1#2{%2365\ifusingtt2366{{\ttsl #2}\let\next=\relax}%2367{\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%2368\next2369}2370\def\smartslanted{\dosmartslant\sl}2371\def\smartitalic{\dosmartslant\it}23722373% Output an italic correction unless \next (presumed to be the following2374% character) is such as not to need one.2375\def\smartitaliccorrection{%2376\ifx\next,%2377\else\ifx\next-%2378\else\ifx\next.%2379\else\ptexslash2380\fi\fi\fi2381\aftersmartic2382}23832384% Unconditional use \ttsl, and no ic. @var is set to this for defuns.2385\def\ttslanted#1{{\ttsl #1}}23862387% @cite is like \smartslanted except unconditionally use \sl. We never want2388% ttsl for book titles, do we?2389\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}23902391\def\aftersmartic{}2392\def\var#1{%2393\let\saveaftersmartic = \aftersmartic2394\def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%2395\smartslanted{#1}%2396}23972398\let\i=\smartitalic2399\let\slanted=\smartslanted2400\let\dfn=\smartslanted2401\let\emph=\smartitalic24022403% Explicit font changes: @r, @sc, undocumented @ii.2404\def\r#1{{\rm #1}} % roman font2405\def\sc#1{{\smallcaps#1}} % smallcaps font2406\def\ii#1{{\it #1}} % italic font24072408% @b, explicit bold. Also @strong.2409\def\b#1{{\bf #1}}2410\let\strong=\b24112412% @sansserif, explicit sans.2413\def\sansserif#1{{\sf #1}}24142415% We can't just use \exhyphenpenalty, because that only has effect at2416% the end of a paragraph. Restore normal hyphenation at the end of the2417% group within which \nohyphenation is presumably called.2418%2419\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}2420\def\restorehyphenation{\hyphenchar\font = `- }24212422% Set sfcode to normal for the chars that usually have another value.2423% Can't use plain's \frenchspacing because it uses the `\x notation, and2424% sometimes \x has an active definition that messes things up.2425%2426\catcode`@=112427\def\plainfrenchspacing{%2428\sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m2429\sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m2430\def\endofsentencespacefactor{1000}% for @. and friends2431}2432\def\plainnonfrenchspacing{%2433\sfcode`\.3000\sfcode`\?3000\sfcode`\!30002434\sfcode`\:2000\sfcode`\;1500\sfcode`\,12502435\def\endofsentencespacefactor{3000}% for @. and friends2436}2437\catcode`@=\other2438\def\endofsentencespacefactor{3000}% default24392440% @t, explicit typewriter.2441\def\t#1{%2442{\tt \rawbackslash \plainfrenchspacing #1}%2443\null2444}24452446% @samp.2447\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}24482449% @indicateurl is \samp, that is, with quotes.2450\let\indicateurl=\samp24512452% @code (and similar) prints in typewriter, but with spaces the same2453% size as normal in the surrounding text, without hyphenation, etc.2454% This is a subroutine for that.2455\def\tclose#1{%2456{%2457% Change normal interword space to be same as for the current font.2458\spaceskip = \fontdimen2\font2459%2460% Switch to typewriter.2461\tt2462%2463% But `\ ' produces the large typewriter interword space.2464\def\ {{\spaceskip = 0pt{} }}%2465%2466% Turn off hyphenation.2467\nohyphenation2468%2469\rawbackslash2470\plainfrenchspacing2471#1%2472}%2473\null % reset spacefactor to 10002474}24752476% We *must* turn on hyphenation at `-' and `_' in @code.2477% Otherwise, it is too hard to avoid overfull hboxes2478% in the Emacs manual, the Library manual, etc.2479%2480% Unfortunately, TeX uses one parameter (\hyphenchar) to control2481% both hyphenation at - and hyphenation within words.2482% We must therefore turn them both off (\tclose does that)2483% and arrange explicitly to hyphenate at a dash.2484% -- rms.2485{2486\catcode`\-=\active \catcode`\_=\active2487\catcode`\'=\active \catcode`\`=\active2488\global\let'=\rq \global\let`=\lq % default definitions2489%2490\global\def\code{\begingroup2491\setupmarkupstyle{code}%2492% The following should really be moved into \setupmarkupstyle handlers.2493\catcode\dashChar=\active \catcode\underChar=\active2494\ifallowcodebreaks2495\let-\codedash2496\let_\codeunder2497\else2498\let-\normaldash2499\let_\realunder2500\fi2501\codex2502}2503}25042505\def\codex #1{\tclose{#1}\endgroup}25062507\def\normaldash{-}2508\def\codedash{-\discretionary{}{}{}}2509\def\codeunder{%2510% this is all so @math{@code{var_name}+1} can work. In math mode, _2511% is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)2512% will therefore expand the active definition of _, which is us2513% (inside @code that is), therefore an endless loop.2514\ifusingtt{\ifmmode2515\mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.2516\else\normalunderscore \fi2517\discretionary{}{}{}}%2518{\_}%2519}25202521% An additional complication: the above will allow breaks after, e.g.,2522% each of the four underscores in __typeof__. This is bad.2523% @allowcodebreaks provides a document-level way to turn breaking at -2524% and _ on and off.2525%2526\newif\ifallowcodebreaks \allowcodebreakstrue25272528\def\keywordtrue{true}2529\def\keywordfalse{false}25302531\parseargdef\allowcodebreaks{%2532\def\txiarg{#1}%2533\ifx\txiarg\keywordtrue2534\allowcodebreakstrue2535\else\ifx\txiarg\keywordfalse2536\allowcodebreaksfalse2537\else2538\errhelp = \EMsimple2539\errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%2540\fi\fi2541}25422543% For @command, @env, @file, @option quotes seem unnecessary,2544% so use \code rather than \samp.2545\let\command=\code2546\let\env=\code2547\let\file=\code2548\let\option=\code25492550% @uref (abbreviation for `urlref') takes an optional (comma-separated)2551% second argument specifying the text to display and an optional third2552% arg as text to display instead of (rather than in addition to) the url2553% itself. First (mandatory) arg is the url.2554% (This \urefnobreak definition isn't used now, leaving it for a while2555% for comparison.)2556\def\urefnobreak#1{\dourefnobreak #1,,,\finish}2557\def\dourefnobreak#1,#2,#3,#4\finish{\begingroup2558\unsepspaces2559\pdfurl{#1}%2560\setbox0 = \hbox{\ignorespaces #3}%2561\ifdim\wd0 > 0pt2562\unhbox0 % third arg given, show only that2563\else2564\setbox0 = \hbox{\ignorespaces #2}%2565\ifdim\wd0 > 0pt2566\ifpdf2567\unhbox0 % PDF: 2nd arg given, show only it2568\else2569\unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url2570\fi2571\else2572\code{#1}% only url given, so show it2573\fi2574\fi2575\endlink2576\endgroup}25772578% This \urefbreak definition is the active one.2579\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}2580\let\uref=\urefbreak2581\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}2582\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example2583\unsepspaces2584\pdfurl{#1}%2585\setbox0 = \hbox{\ignorespaces #3}%2586\ifdim\wd0 > 0pt2587\unhbox0 % third arg given, show only that2588\else2589\setbox0 = \hbox{\ignorespaces #2}%2590\ifdim\wd0 > 0pt2591\ifpdf2592\unhbox0 % PDF: 2nd arg given, show only it2593\else2594\unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url2595\fi2596\else2597\urefcode{#1}% only url given, so show it2598\fi2599\fi2600\endlink2601\endgroup}26022603% Allow line breaks around only a few characters (only).2604\def\urefcatcodes{%2605\catcode\ampChar=\active \catcode\dotChar=\active2606\catcode\hashChar=\active \catcode\questChar=\active2607\catcode\slashChar=\active2608}2609{2610\urefcatcodes2611%2612\global\def\urefcode{\begingroup2613\setupmarkupstyle{code}%2614\urefcatcodes2615\let&\urefcodeamp2616\let.\urefcodedot2617\let#\urefcodehash2618\let?\urefcodequest2619\let/\urefcodeslash2620\codex2621}2622%2623% By default, they are just regular characters.2624\global\def&{\normalamp}2625\global\def.{\normaldot}2626\global\def#{\normalhash}2627\global\def?{\normalquest}2628\global\def/{\normalslash}2629}26302631% we put a little stretch before and after the breakable chars, to help2632% line breaking of long url's. The unequal skips make look better in2633% cmtt at least, especially for dots.2634\def\urefprestretch{\urefprebreak \hskip0pt plus.13em }2635\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em }2636%2637\def\urefcodeamp{\urefprestretch \&\urefpoststretch}2638\def\urefcodedot{\urefprestretch .\urefpoststretch}2639\def\urefcodehash{\urefprestretch \#\urefpoststretch}2640\def\urefcodequest{\urefprestretch ?\urefpoststretch}2641\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}2642{2643\catcode`\/=\active2644\global\def\urefcodeslashfinish{%2645\urefprestretch \slashChar2646% Allow line break only after the final / in a sequence of2647% slashes, to avoid line break between the slashes in http://.2648\ifx\next/\else \urefpoststretch \fi2649}2650}26512652% One more complication: by default we'll break after the special2653% characters, but some people like to break before the special chars, so2654% allow that. Also allow no breaking at all, for manual control.2655%2656\parseargdef\urefbreakstyle{%2657\def\txiarg{#1}%2658\ifx\txiarg\wordnone2659\def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}2660\else\ifx\txiarg\wordbefore2661\def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}2662\else\ifx\txiarg\wordafter2663\def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}2664\else2665\errhelp = \EMsimple2666\errmessage{Unknown @urefbreakstyle setting `\txiarg'}%2667\fi\fi\fi2668}2669\def\wordafter{after}2670\def\wordbefore{before}2671\def\wordnone{none}26722673\urefbreakstyle after26742675% @url synonym for @uref, since that's how everyone uses it.2676%2677\let\url=\uref26782679% rms does not like angle brackets --karl, 17may97.2680% So now @email is just like @uref, unless we are pdf.2681%2682%\def\email#1{\angleleft{\tt #1}\angleright}2683\ifpdf2684\def\email#1{\doemail#1,,\finish}2685\def\doemail#1,#2,#3\finish{\begingroup2686\unsepspaces2687\pdfurl{mailto:#1}%2688\setbox0 = \hbox{\ignorespaces #2}%2689\ifdim\wd0>0pt\unhbox0\else\code{#1}\fi2690\endlink2691\endgroup}2692\else2693\let\email=\uref2694\fi26952696% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),2697% `example' (@kbd uses ttsl only inside of @example and friends),2698% or `code' (@kbd uses normal tty font always).2699\parseargdef\kbdinputstyle{%2700\def\txiarg{#1}%2701\ifx\txiarg\worddistinct2702\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%2703\else\ifx\txiarg\wordexample2704\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%2705\else\ifx\txiarg\wordcode2706\gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%2707\else2708\errhelp = \EMsimple2709\errmessage{Unknown @kbdinputstyle setting `\txiarg'}%2710\fi\fi\fi2711}2712\def\worddistinct{distinct}2713\def\wordexample{example}2714\def\wordcode{code}27152716% Default is `distinct'.2717\kbdinputstyle distinct27182719% @kbd is like @code, except that if the argument is just one @key command,2720% then @kbd has no effect.2721\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}27222723\def\xkey{\key}2724\def\kbdsub#1#2#3\par{%2725\def\one{#1}\def\three{#3}\def\threex{??}%2726\ifx\one\xkey\ifx\threex\three \key{#2}%2727\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi2728\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi2729}27302731% definition of @key that produces a lozenge. Doesn't adjust to text size.2732%\setfont\keyrm\rmshape{8}{1000}{OT1}2733%\font\keysy=cmsy92734%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%2735% \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%2736% \vbox{\hrule\kern-0.4pt2737% \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%2738% \kern-0.4pt\hrule}%2739% \kern-.06em\raise0.4pt\hbox{\angleright}}}}27402741% definition of @key with no lozenge. If the current font is already2742% monospace, don't change it; that way, we respect @kbdinputstyle. But2743% if it isn't monospace, then use \tt.2744%2745\def\key#1{{\setupmarkupstyle{key}%2746\nohyphenation2747\ifmonospace\else\tt\fi2748#1}\null}27492750% @clicksequence{File @click{} Open ...}2751\def\clicksequence#1{\begingroup #1\endgroup}27522753% @clickstyle @arrow (by default)2754\parseargdef\clickstyle{\def\click{#1}}2755\def\click{\arrow}27562757% Typeset a dimension, e.g., `in' or `pt'. The only reason for the2758% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.2759%2760\def\dmn#1{\thinspace #1}27612762% @l was never documented to mean ``switch to the Lisp font'',2763% and it is not used as such in any manual I can find. We need it for2764% Polish suppressed-l. --karl, 22sep96.2765%\def\l#1{{\li #1}\null}27662767% @acronym for "FBI", "NATO", and the like.2768% We print this one point size smaller, since it's intended for2769% all-uppercase.2770%2771\def\acronym#1{\doacronym #1,,\finish}2772\def\doacronym#1,#2,#3\finish{%2773{\selectfonts\lsize #1}%2774\def\temp{#2}%2775\ifx\temp\empty \else2776\space ({\unsepspaces \ignorespaces \temp \unskip})%2777\fi2778\null % reset \spacefactor=10002779}27802781% @abbr for "Comput. J." and the like.2782% No font change, but don't do end-of-sentence spacing.2783%2784\def\abbr#1{\doabbr #1,,\finish}2785\def\doabbr#1,#2,#3\finish{%2786{\plainfrenchspacing #1}%2787\def\temp{#2}%2788\ifx\temp\empty \else2789\space ({\unsepspaces \ignorespaces \temp \unskip})%2790\fi2791\null % reset \spacefactor=10002792}27932794% @asis just yields its argument. Used with @table, for example.2795%2796\def\asis#1{#1}27972798% @math outputs its argument in math mode.2799%2800% One complication: _ usually means subscripts, but it could also mean2801% an actual _ character, as in @math{@var{some_variable} + 1}. So make2802% _ active, and distinguish by seeing if the current family is \slfam,2803% which is what @var uses.2804{2805\catcode`\_ = \active2806\gdef\mathunderscore{%2807\catcode`\_=\active2808\def_{\ifnum\fam=\slfam \_\else\sb\fi}%2809}2810}2811% Another complication: we want \\ (and @\) to output a math (or tt) \.2812% FYI, plain.tex uses \\ as a temporary control sequence (for no2813% particular reason), but this is not advertised and we don't care.2814%2815% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.2816\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}2817%2818\def\math{%2819\tex2820\mathunderscore2821\let\\ = \mathbackslash2822\mathactive2823% make the texinfo accent commands work in math mode2824\let\"=\ddot2825\let\'=\acute2826\let\==\bar2827\let\^=\hat2828\let\`=\grave2829\let\u=\breve2830\let\v=\check2831\let\~=\tilde2832\let\dotaccent=\dot2833$\finishmath2834}2835\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.28362837% Some active characters (such as <) are spaced differently in math.2838% We have to reset their definitions in case the @math was an argument2839% to a command which sets the catcodes (such as @item or @section).2840%2841{2842\catcode`^ = \active2843\catcode`< = \active2844\catcode`> = \active2845\catcode`+ = \active2846\catcode`' = \active2847\gdef\mathactive{%2848\let^ = \ptexhat2849\let< = \ptexless2850\let> = \ptexgtr2851\let+ = \ptexplus2852\let' = \ptexquoteright2853}2854}28552856% ctrl is no longer a Texinfo command, but leave this definition for fun.2857\def\ctrl #1{{\tt \rawbackslash \hat}#1}28582859% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.2860% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,2861% except specified as a normal braced arg, so no newlines to worry about.2862%2863\def\outfmtnametex{tex}2864%2865\long\def\inlinefmt#1{\doinlinefmt #1,\finish}2866\long\def\doinlinefmt#1,#2,\finish{%2867\def\inlinefmtname{#1}%2868\ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi2869}2870% For raw, must switch into @tex before parsing the argument, to avoid2871% setting catcodes prematurely. Doing it this way means that, for2872% example, @inlineraw{html, foo{bar} gets a parse error instead of being2873% ignored. But this isn't important because if people want a literal2874% *right* brace they would have to use a command anyway, so they may as2875% well use a command to get a left brace too. We could re-use the2876% delimiter character idea from \verb, but it seems like overkill.2877%2878\long\def\inlineraw{\tex \doinlineraw}2879\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}2880\def\doinlinerawtwo#1,#2,\finish{%2881\def\inlinerawname{#1}%2882\ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi2883\endgroup % close group opened by \tex.2884}288528862887\message{glyphs,}2888% and logos.28892890% @@ prints an @, as does @atchar{}.2891\def\@{\char64 }2892\let\atchar=\@28932894% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.2895% Unless we're in typewriter, use \ecfont because the CM text fonts do2896% not have braces, and we don't want to switch into math.2897\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}}2898\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}}2899\let\{=\mylbrace \let\lbracechar=\{2900\let\}=\myrbrace \let\rbracechar=\}2901\begingroup2902% Definitions to produce \{ and \} commands for indices,2903% and @{ and @} for the aux/toc files.2904\catcode`\{ = \other \catcode`\} = \other2905\catcode`\[ = 1 \catcode`\] = 22906\catcode`\! = 0 \catcode`\\ = \other2907!gdef!lbracecmd[\{]%2908!gdef!rbracecmd[\}]%2909!gdef!lbraceatcmd[@{]%2910!gdef!rbraceatcmd[@}]%2911!endgroup29122913% @comma{} to avoid , parsing problems.2914\let\comma = ,29152916% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent2917% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.2918\let\, = \ptexc2919\let\dotaccent = \ptexdot2920\def\ringaccent#1{{\accent23 #1}}2921\let\tieaccent = \ptext2922\let\ubaraccent = \ptexb2923\let\udotaccent = \d29242925% Other special characters: @questiondown @exclamdown @ordf @ordm2926% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.2927\def\questiondown{?`}2928\def\exclamdown{!`}2929\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}2930\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}29312932% Dotless i and dotless j, used for accents.2933\def\imacro{i}2934\def\jmacro{j}2935\def\dotless#1{%2936\def\temp{#1}%2937\ifx\temp\imacro \ifmmode\imath \else\ptexi \fi2938\else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi2939\else \errmessage{@dotless can be used only with i or j}%2940\fi\fi2941}29422943% The \TeX{} logo, as in plain, but resetting the spacing so that a2944% period following counts as ending a sentence. (Idea found in latex.)2945%2946\edef\TeX{\TeX \spacefactor=1000 }29472948% @LaTeX{} logo. Not quite the same results as the definition in2949% latex.ltx, since we use a different font for the raised A; it's most2950% convenient for us to use an explicitly smaller font, rather than using2951% the \scriptstyle font (since we don't reset \scriptstyle and2952% \scriptscriptstyle).2953%2954\def\LaTeX{%2955L\kern-.36em2956{\setbox0=\hbox{T}%2957\vbox to \ht0{\hbox{%2958\ifx\textnominalsize\xwordpt2959% for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX.2960% Revert to plain's \scriptsize, which is 7pt.2961\count255=\the\fam $\fam\count255 \scriptstyle A$%2962\else2963% For 11pt, we can use our lllsize.2964\selectfonts\lllsize A%2965\fi2966}%2967\vss2968}}%2969\kern-.15em2970\TeX2971}29722973% Some math mode symbols.2974\def\bullet{$\ptexbullet$}2975\def\geq{\ifmmode \ge\else $\ge$\fi}2976\def\leq{\ifmmode \le\else $\le$\fi}2977\def\minus{\ifmmode -\else $-$\fi}29782979% @dots{} outputs an ellipsis using the current font.2980% We do .5em per period so that it has the same spacing in the cm2981% typewriter fonts as three actual period characters; on the other hand,2982% in other typewriter fonts three periods are wider than 1.5em. So do2983% whichever is larger.2984%2985\def\dots{%2986\leavevmode2987\setbox0=\hbox{...}% get width of three periods2988\ifdim\wd0 > 1.5em2989\dimen0 = \wd02990\else2991\dimen0 = 1.5em2992\fi2993\hbox to \dimen0{%2994\hskip 0pt plus.25fil2995.\hskip 0pt plus1fil2996.\hskip 0pt plus1fil2997.\hskip 0pt plus.5fil2998}%2999}30003001% @enddots{} is an end-of-sentence ellipsis.3002%3003\def\enddots{%3004\dots3005\spacefactor=\endofsentencespacefactor3006}30073008% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.3009%3010% Since these characters are used in examples, they should be an even number of3011% \tt widths. Each \tt character is 1en, so two makes it 1em.3012%3013\def\point{$\star$}3014\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}3015\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}3016\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}3017\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}3018\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}30193020% The @error{} command.3021% Adapted from the TeXbook's \boxit.3022%3023\newbox\errorbox3024%3025{\tentt \global\dimen0 = 3em}% Width of the box.3026\dimen2 = .55pt % Thickness of rules3027% The text. (`r' is open on the right, `e' somewhat less so on the left.)3028\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}3029%3030\setbox\errorbox=\hbox to \dimen0{\hfil3031\hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.3032\advance\hsize by -2\dimen2 % Rules.3033\vbox{%3034\hrule height\dimen23035\hbox{\vrule width\dimen2 \kern3pt % Space to left of text.3036\vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.3037\kern3pt\vrule width\dimen2}% Space to right.3038\hrule height\dimen2}3039\hfil}3040%3041\def\error{\leavevmode\lower.7ex\copy\errorbox}30423043% @pounds{} is a sterling sign, which Knuth put in the CM italic font.3044%3045\def\pounds{{\it\$}}30463047% @euro{} comes from a separate font, depending on the current style.3048% We use the free feym* fonts from the eurosym package by Henrik3049% Theiling, which support regular, slanted, bold and bold slanted (and3050% "outlined" (blackboard board, sort of) versions, which we don't need).3051% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.3052%3053% Although only regular is the truly official Euro symbol, we ignore3054% that. The Euro is designed to be slightly taller than the regular3055% font height.3056%3057% feymr - regular3058% feymo - slanted3059% feybr - bold3060% feybo - bold slanted3061%3062% There is no good (free) typewriter version, to my knowledge.3063% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.3064% Hmm.3065%3066% Also doesn't work in math. Do we need to do math with euro symbols?3067% Hope not.3068%3069%3070\def\euro{{\eurofont e}}3071\def\eurofont{%3072% We set the font at each command, rather than predefining it in3073% \textfonts and the other font-switching commands, so that3074% installations which never need the symbol don't have to have the3075% font installed.3076%3077% There is only one designed size (nominal 10pt), so we always scale3078% that to the current nominal size.3079%3080% By the way, simply using "at 1em" works for cmr10 and the like, but3081% does not work for cmbx10 and other extended/shrunken fonts.3082%3083\def\eurosize{\csname\curfontsize nominalsize\endcsname}%3084%3085\ifx\curfontstyle\bfstylename3086% bold:3087\font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize3088\else3089% regular:3090\font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize3091\fi3092\thiseurofont3093}30943095% Glyphs from the EC fonts. We don't use \let for the aliases, because3096% sometimes we redefine the original macro, and the alias should reflect3097% the redefinition.3098%3099% Use LaTeX names for the Icelandic letters.3100\def\DH{{\ecfont \char"D0}} % Eth3101\def\dh{{\ecfont \char"F0}} % eth3102\def\TH{{\ecfont \char"DE}} % Thorn3103\def\th{{\ecfont \char"FE}} % thorn3104%3105\def\guillemetleft{{\ecfont \char"13}}3106\def\guillemotleft{\guillemetleft}3107\def\guillemetright{{\ecfont \char"14}}3108\def\guillemotright{\guillemetright}3109\def\guilsinglleft{{\ecfont \char"0E}}3110\def\guilsinglright{{\ecfont \char"0F}}3111\def\quotedblbase{{\ecfont \char"12}}3112\def\quotesinglbase{{\ecfont \char"0D}}3113%3114% This positioning is not perfect (see the ogonek LaTeX package), but3115% we have the precomposed glyphs for the most common cases. We put the3116% tests to use those glyphs in the single \ogonek macro so we have fewer3117% dummy definitions to worry about for index entries, etc.3118%3119% ogonek is also used with other letters in Lithuanian (IOU), but using3120% the precomposed glyphs for those is not so easy since they aren't in3121% the same EC font.3122\def\ogonek#1{{%3123\def\temp{#1}%3124\ifx\temp\macrocharA\Aogonek3125\else\ifx\temp\macrochara\aogonek3126\else\ifx\temp\macrocharE\Eogonek3127\else\ifx\temp\macrochare\eogonek3128\else3129\ecfont \setbox0=\hbox{#1}%3130\ifdim\ht0=1ex\accent"0C #1%3131\else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%3132\fi3133\fi\fi\fi\fi3134}%3135}3136\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}3137\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}3138\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}3139\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}3140%3141% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.3142\def\ecfont{%3143% We can't distinguish serif/sans and italic/slanted, but this3144% is used for crude hacks anyway (like adding French and German3145% quotes to documents typeset with CM, where we lose kerning), so3146% hopefully nobody will notice/care.3147\edef\ecsize{\csname\curfontsize ecsize\endcsname}%3148\edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%3149\ifmonospace3150% typewriter:3151\font\thisecfont = ectt\ecsize \space at \nominalsize3152\else3153\ifx\curfontstyle\bfstylename3154% bold:3155\font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize3156\else3157% regular:3158\font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize3159\fi3160\fi3161\thisecfont3162}31633164% @registeredsymbol - R in a circle. The font for the R should really3165% be smaller yet, but lllsize is the best we can do for now.3166% Adapted from the plain.tex definition of \copyright.3167%3168\def\registeredsymbol{%3169$^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%3170\hfil\crcr\Orb}}%3171}$%3172}31733174% @textdegree - the normal degrees sign.3175%3176\def\textdegree{$^\circ$}31773178% Laurent Siebenmann reports \Orb undefined with:3179% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:383180% so we'll define it if necessary.3181%3182\ifx\Orb\thisisundefined3183\def\Orb{\mathhexbox20D}3184\fi31853186% Quotes.3187\chardef\quotedblleft="5C3188\chardef\quotedblright=`\"3189\chardef\quoteleft=`\`3190\chardef\quoteright=`\'319131923193\message{page headings,}31943195\newskip\titlepagetopglue \titlepagetopglue = 1.5in3196\newskip\titlepagebottomglue \titlepagebottomglue = 2pc31973198% First the title page. Must do @settitle before @titlepage.3199\newif\ifseenauthor3200\newif\iffinishedtitlepage32013202% Do an implicit @contents or @shortcontents after @end titlepage if the3203% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.3204%3205\newif\ifsetcontentsaftertitlepage3206\let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue3207\newif\ifsetshortcontentsaftertitlepage3208\let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue32093210\parseargdef\shorttitlepage{%3211\begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%3212\endgroup\page\hbox{}\page}32133214\envdef\titlepage{%3215% Open one extra group, as we want to close it in the middle of \Etitlepage.3216\begingroup3217\parindent=0pt \textfonts3218% Leave some space at the very top of the page.3219\vglue\titlepagetopglue3220% No rule at page bottom unless we print one at the top with @title.3221\finishedtitlepagetrue3222%3223% Most title ``pages'' are actually two pages long, with space3224% at the top of the second. We don't want the ragged left on the second.3225\let\oldpage = \page3226\def\page{%3227\iffinishedtitlepage\else3228\finishtitlepage3229\fi3230\let\page = \oldpage3231\page3232\null3233}%3234}32353236\def\Etitlepage{%3237\iffinishedtitlepage\else3238\finishtitlepage3239\fi3240% It is important to do the page break before ending the group,3241% because the headline and footline are only empty inside the group.3242% If we use the new definition of \page, we always get a blank page3243% after the title page, which we certainly don't want.3244\oldpage3245\endgroup3246%3247% Need this before the \...aftertitlepage checks so that if they are3248% in effect the toc pages will come out with page numbers.3249\HEADINGSon3250%3251% If they want short, they certainly want long too.3252\ifsetshortcontentsaftertitlepage3253\shortcontents3254\contents3255\global\let\shortcontents = \relax3256\global\let\contents = \relax3257\fi3258%3259\ifsetcontentsaftertitlepage3260\contents3261\global\let\contents = \relax3262\global\let\shortcontents = \relax3263\fi3264}32653266\def\finishtitlepage{%3267\vskip4pt \hrule height 2pt width \hsize3268\vskip\titlepagebottomglue3269\finishedtitlepagetrue3270}32713272% Settings used for typesetting titles: no hyphenation, no indentation,3273% don't worry much about spacing, ragged right. This should be used3274% inside a \vbox, and fonts need to be set appropriately first. Because3275% it is always used for titles, nothing else, we call \rmisbold. \par3276% should be specified before the end of the \vbox, since a vbox is a group.3277%3278\def\raggedtitlesettings{%3279\rmisbold3280\hyphenpenalty=100003281\parindent=0pt3282\tolerance=50003283\ptexraggedright3284}32853286% Macros to be used within @titlepage:32873288\let\subtitlerm=\tenrm3289\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}32903291\parseargdef\title{%3292\checkenv\titlepage3293\vbox{\titlefonts \raggedtitlesettings #1\par}%3294% print a rule at the page bottom also.3295\finishedtitlepagefalse3296\vskip4pt \hrule height 4pt width \hsize \vskip4pt3297}32983299\parseargdef\subtitle{%3300\checkenv\titlepage3301{\subtitlefont \rightline{#1}}%3302}33033304% @author should come last, but may come many times.3305% It can also be used inside @quotation.3306%3307\parseargdef\author{%3308\def\temp{\quotation}%3309\ifx\thisenv\temp3310\def\quotationauthor{#1}% printed in \Equotation.3311\else3312\checkenv\titlepage3313\ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi3314{\secfonts\rmisbold \leftline{#1}}%3315\fi3316}331733183319% Set up page headings and footings.33203321\let\thispage=\folio33223323\newtoks\evenheadline % headline on even pages3324\newtoks\oddheadline % headline on odd pages3325\newtoks\evenfootline % footline on even pages3326\newtoks\oddfootline % footline on odd pages33273328% Now make TeX use those variables3329\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline3330\else \the\evenheadline \fi}}3331\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline3332\else \the\evenfootline \fi}\HEADINGShook}3333\let\HEADINGShook=\relax33343335% Commands to set those variables.3336% For example, this is what @headings on does3337% @evenheading @thistitle|@thispage|@thischapter3338% @oddheading @thischapter|@thispage|@thistitle3339% @evenfooting @thisfile||3340% @oddfooting ||@thisfile334133423343\def\evenheading{\parsearg\evenheadingxxx}3344\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}3345\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%3346\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}33473348\def\oddheading{\parsearg\oddheadingxxx}3349\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}3350\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%3351\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}33523353\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%33543355\def\evenfooting{\parsearg\evenfootingxxx}3356\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}3357\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%3358\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}33593360\def\oddfooting{\parsearg\oddfootingxxx}3361\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}3362\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%3363\global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%3364%3365% Leave some space for the footline. Hopefully ok to assume3366% @evenfooting will not be used by itself.3367\global\advance\pageheight by -12pt3368\global\advance\vsize by -12pt3369}33703371\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}33723373% @evenheadingmarks top \thischapter <- chapter at the top of a page3374% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page3375%3376% The same set of arguments for:3377%3378% @oddheadingmarks3379% @evenfootingmarks3380% @oddfootingmarks3381% @everyheadingmarks3382% @everyfootingmarks33833384\def\evenheadingmarks{\headingmarks{even}{heading}}3385\def\oddheadingmarks{\headingmarks{odd}{heading}}3386\def\evenfootingmarks{\headingmarks{even}{footing}}3387\def\oddfootingmarks{\headingmarks{odd}{footing}}3388\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}3389\headingmarks{odd}{heading}{#1} }3390\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}3391\headingmarks{odd}{footing}{#1} }3392% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.3393\def\headingmarks#1#2#3 {%3394\expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname3395\global\expandafter\let\csname get#1#2marks\endcsname \temp3396}33973398\everyheadingmarks bottom3399\everyfootingmarks bottom34003401% @headings double turns headings on for double-sided printing.3402% @headings single turns headings on for single-sided printing.3403% @headings off turns them off.3404% @headings on same as @headings double, retained for compatibility.3405% @headings after turns on double-sided headings after this page.3406% @headings doubleafter turns on double-sided headings after this page.3407% @headings singleafter turns on single-sided headings after this page.3408% By default, they are off at the start of a document,3409% and turned `on' after @end titlepage.34103411\def\headings #1 {\csname HEADINGS#1\endcsname}34123413\def\headingsoff{% non-global headings elimination3414\evenheadline={\hfil}\evenfootline={\hfil}%3415\oddheadline={\hfil}\oddfootline={\hfil}%3416}34173418\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting3419\HEADINGSoff % it's the default34203421% When we turn headings on, set the page number to 1.3422% For double-sided printing, put current file name in lower left corner,3423% chapter name on inside top of right hand pages, document3424% title on inside top of left hand pages, and page numbers on outside top3425% edge of all pages.3426\def\HEADINGSdouble{%3427\global\pageno=13428\global\evenfootline={\hfil}3429\global\oddfootline={\hfil}3430\global\evenheadline={\line{\folio\hfil\thistitle}}3431\global\oddheadline={\line{\thischapter\hfil\folio}}3432\global\let\contentsalignmacro = \chapoddpage3433}3434\let\contentsalignmacro = \chappager34353436% For single-sided printing, chapter title goes across top left of page,3437% page number on top right.3438\def\HEADINGSsingle{%3439\global\pageno=13440\global\evenfootline={\hfil}3441\global\oddfootline={\hfil}3442\global\evenheadline={\line{\thischapter\hfil\folio}}3443\global\oddheadline={\line{\thischapter\hfil\folio}}3444\global\let\contentsalignmacro = \chappager3445}3446\def\HEADINGSon{\HEADINGSdouble}34473448\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}3449\let\HEADINGSdoubleafter=\HEADINGSafter3450\def\HEADINGSdoublex{%3451\global\evenfootline={\hfil}3452\global\oddfootline={\hfil}3453\global\evenheadline={\line{\folio\hfil\thistitle}}3454\global\oddheadline={\line{\thischapter\hfil\folio}}3455\global\let\contentsalignmacro = \chapoddpage3456}34573458\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}3459\def\HEADINGSsinglex{%3460\global\evenfootline={\hfil}3461\global\oddfootline={\hfil}3462\global\evenheadline={\line{\thischapter\hfil\folio}}3463\global\oddheadline={\line{\thischapter\hfil\folio}}3464\global\let\contentsalignmacro = \chappager3465}34663467% Subroutines used in generating headings3468% This produces Day Month Year style of output.3469% Only define if not already defined, in case a txi-??.tex file has set3470% up a different format (e.g., txi-cs.tex does this).3471\ifx\today\thisisundefined3472\def\today{%3473\number\day\space3474\ifcase\month3475\or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr3476\or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug3477\or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec3478\fi3479\space\number\year}3480\fi34813482% @settitle line... specifies the title of the document, for headings.3483% It generates no output of its own.3484\def\thistitle{\putwordNoTitle}3485\def\settitle{\parsearg{\gdef\thistitle}}348634873488\message{tables,}3489% Tables -- @table, @ftable, @vtable, @item(x).34903491% default indentation of table text3492\newdimen\tableindent \tableindent=.8in3493% default indentation of @itemize and @enumerate text3494\newdimen\itemindent \itemindent=.3in3495% margin between end of table item and start of table text.3496\newdimen\itemmargin \itemmargin=.1in34973498% used internally for \itemindent minus \itemmargin3499\newdimen\itemmax35003501% Note @table, @ftable, and @vtable define @item, @itemx, etc., with3502% these defs.3503% They also define \itemindex3504% to index the item name in whatever manner is desired (perhaps none).35053506\newif\ifitemxneedsnegativevskip35073508\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}35093510\def\internalBitem{\smallbreak \parsearg\itemzzz}3511\def\internalBitemx{\itemxpar \parsearg\itemzzz}35123513\def\itemzzz #1{\begingroup %3514\advance\hsize by -\rightskip3515\advance\hsize by -\tableindent3516\setbox0=\hbox{\itemindicate{#1}}%3517\itemindex{#1}%3518\nobreak % This prevents a break before @itemx.3519%3520% If the item text does not fit in the space we have, put it on a line3521% by itself, and do not allow a page break either before or after that3522% line. We do not start a paragraph here because then if the next3523% command is, e.g., @kindex, the whatsit would get put into the3524% horizontal list on a line by itself, resulting in extra blank space.3525\ifdim \wd0>\itemmax3526%3527% Make this a paragraph so we get the \parskip glue and wrapping,3528% but leave it ragged-right.3529\begingroup3530\advance\leftskip by-\tableindent3531\advance\hsize by\tableindent3532\advance\rightskip by0pt plus1fil\relax3533\leavevmode\unhbox0\par3534\endgroup3535%3536% We're going to be starting a paragraph, but we don't want the3537% \parskip glue -- logically it's part of the @item we just started.3538\nobreak \vskip-\parskip3539%3540% Stop a page break at the \parskip glue coming up. However, if3541% what follows is an environment such as @example, there will be no3542% \parskip glue; then the negative vskip we just inserted would3543% cause the example and the item to crash together. So we use this3544% bizarre value of 10001 as a signal to \aboveenvbreak to insert3545% \parskip glue after all. Section titles are handled this way also.3546%3547\penalty 100013548\endgroup3549\itemxneedsnegativevskipfalse3550\else3551% The item text fits into the space. Start a paragraph, so that the3552% following text (if any) will end up on the same line.3553\noindent3554% Do this with kerns and \unhbox so that if there is a footnote in3555% the item text, it can migrate to the main vertical list and3556% eventually be printed.3557\nobreak\kern-\tableindent3558\dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd03559\unhbox03560\nobreak\kern\dimen03561\endgroup3562\itemxneedsnegativevskiptrue3563\fi3564}35653566\def\item{\errmessage{@item while not in a list environment}}3567\def\itemx{\errmessage{@itemx while not in a list environment}}35683569% @table, @ftable, @vtable.3570\envdef\table{%3571\let\itemindex\gobble3572\tablecheck{table}%3573}3574\envdef\ftable{%3575\def\itemindex ##1{\doind {fn}{\code{##1}}}%3576\tablecheck{ftable}%3577}3578\envdef\vtable{%3579\def\itemindex ##1{\doind {vr}{\code{##1}}}%3580\tablecheck{vtable}%3581}3582\def\tablecheck#1{%3583\ifnum \the\catcode`\^^M=\active3584\endgroup3585\errmessage{This command won't work in this context; perhaps the problem is3586that we are \inenvironment\thisenv}%3587\def\next{\doignore{#1}}%3588\else3589\let\next\tablex3590\fi3591\next3592}3593\def\tablex#1{%3594\def\itemindicate{#1}%3595\parsearg\tabley3596}3597\def\tabley#1{%3598{%3599\makevalueexpandable3600\edef\temp{\noexpand\tablez #1\space\space\space}%3601\expandafter3602}\temp \endtablez3603}3604\def\tablez #1 #2 #3 #4\endtablez{%3605\aboveenvbreak3606\ifnum 0#1>0 \advance \leftskip by #1\mil \fi3607\ifnum 0#2>0 \tableindent=#2\mil \fi3608\ifnum 0#3>0 \advance \rightskip by #3\mil \fi3609\itemmax=\tableindent3610\advance \itemmax by -\itemmargin3611\advance \leftskip by \tableindent3612\exdentamount=\tableindent3613\parindent = 0pt3614\parskip = \smallskipamount3615\ifdim \parskip=0pt \parskip=2pt \fi3616\let\item = \internalBitem3617\let\itemx = \internalBitemx3618}3619\def\Etable{\endgraf\afterenvbreak}3620\let\Eftable\Etable3621\let\Evtable\Etable3622\let\Eitemize\Etable3623\let\Eenumerate\Etable36243625% This is the counter used by @enumerate, which is really @itemize36263627\newcount \itemno36283629\envdef\itemize{\parsearg\doitemize}36303631\def\doitemize#1{%3632\aboveenvbreak3633\itemmax=\itemindent3634\advance\itemmax by -\itemmargin3635\advance\leftskip by \itemindent3636\exdentamount=\itemindent3637\parindent=0pt3638\parskip=\smallskipamount3639\ifdim\parskip=0pt \parskip=2pt \fi3640%3641% Try typesetting the item mark that if the document erroneously says3642% something like @itemize @samp (intending @table), there's an error3643% right away at the @itemize. It's not the best error message in the3644% world, but it's better than leaving it to the @item. This means if3645% the user wants an empty mark, they have to say @w{} not just @w.3646\def\itemcontents{#1}%3647\setbox0 = \hbox{\itemcontents}%3648%3649% @itemize with no arg is equivalent to @itemize @bullet.3650\ifx\itemcontents\empty\def\itemcontents{\bullet}\fi3651%3652\let\item=\itemizeitem3653}36543655% Definition of @item while inside @itemize and @enumerate.3656%3657\def\itemizeitem{%3658\advance\itemno by 1 % for enumerations3659{\let\par=\endgraf \smallbreak}% reasonable place to break3660{%3661% If the document has an @itemize directly after a section title, a3662% \nobreak will be last on the list, and \sectionheading will have3663% done a \vskip-\parskip. In that case, we don't want to zero3664% parskip, or the item text will crash with the heading. On the3665% other hand, when there is normal text preceding the item (as there3666% usually is), we do want to zero parskip, or there would be too much3667% space. In that case, we won't have a \nobreak before. At least3668% that's the theory.3669\ifnum\lastpenalty<10000 \parskip=0in \fi3670\noindent3671\hbox to 0pt{\hss \itemcontents \kern\itemmargin}%3672%3673\vadjust{\penalty 1200}}% not good to break after first line of item.3674\flushcr3675}36763677% \splitoff TOKENS\endmark defines \first to be the first token in3678% TOKENS, and \rest to be the remainder.3679%3680\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%36813682% Allow an optional argument of an uppercase letter, lowercase letter,3683% or number, to specify the first label in the enumerated list. No3684% argument is the same as `1'.3685%3686\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}3687\def\enumeratey #1 #2\endenumeratey{%3688% If we were given no argument, pretend we were given `1'.3689\def\thearg{#1}%3690\ifx\thearg\empty \def\thearg{1}\fi3691%3692% Detect if the argument is a single token. If so, it might be a3693% letter. Otherwise, the only valid thing it can be is a number.3694% (We will always have one token, because of the test we just made.3695% This is a good thing, since \splitoff doesn't work given nothing at3696% all -- the first parameter is undelimited.)3697\expandafter\splitoff\thearg\endmark3698\ifx\rest\empty3699% Only one token in the argument. It could still be anything.3700% A ``lowercase letter'' is one whose \lccode is nonzero.3701% An ``uppercase letter'' is one whose \lccode is both nonzero, and3702% not equal to itself.3703% Otherwise, we assume it's a number.3704%3705% We need the \relax at the end of the \ifnum lines to stop TeX from3706% continuing to look for a <number>.3707%3708\ifnum\lccode\expandafter`\thearg=0\relax3709\numericenumerate % a number (we hope)3710\else3711% It's a letter.3712\ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax3713\lowercaseenumerate % lowercase letter3714\else3715\uppercaseenumerate % uppercase letter3716\fi3717\fi3718\else3719% Multiple tokens in the argument. We hope it's a number.3720\numericenumerate3721\fi3722}37233724% An @enumerate whose labels are integers. The starting integer is3725% given in \thearg.3726%3727\def\numericenumerate{%3728\itemno = \thearg3729\startenumeration{\the\itemno}%3730}37313732% The starting (lowercase) letter is in \thearg.3733\def\lowercaseenumerate{%3734\itemno = \expandafter`\thearg3735\startenumeration{%3736% Be sure we're not beyond the end of the alphabet.3737\ifnum\itemno=03738\errmessage{No more lowercase letters in @enumerate; get a bigger3739alphabet}%3740\fi3741\char\lccode\itemno3742}%3743}37443745% The starting (uppercase) letter is in \thearg.3746\def\uppercaseenumerate{%3747\itemno = \expandafter`\thearg3748\startenumeration{%3749% Be sure we're not beyond the end of the alphabet.3750\ifnum\itemno=03751\errmessage{No more uppercase letters in @enumerate; get a bigger3752alphabet}3753\fi3754\char\uccode\itemno3755}%3756}37573758% Call \doitemize, adding a period to the first argument and supplying the3759% common last two arguments. Also subtract one from the initial value in3760% \itemno, since @item increments \itemno.3761%3762\def\startenumeration#1{%3763\advance\itemno by -13764\doitemize{#1.}\flushcr3765}37663767% @alphaenumerate and @capsenumerate are abbreviations for giving an arg3768% to @enumerate.3769%3770\def\alphaenumerate{\enumerate{a}}3771\def\capsenumerate{\enumerate{A}}3772\def\Ealphaenumerate{\Eenumerate}3773\def\Ecapsenumerate{\Eenumerate}377437753776% @multitable macros3777% Amy Hendrickson, 8/18/94, 3/6/963778%3779% @multitable ... @end multitable will make as many columns as desired.3780% Contents of each column will wrap at width given in preamble. Width3781% can be specified either with sample text given in a template line,3782% or in percent of \hsize, the current width of text on page.37833784% Table can continue over pages but will only break between lines.37853786% To make preamble:3787%3788% Either define widths of columns in terms of percent of \hsize:3789% @multitable @columnfractions .25 .3 .453790% @item ...3791%3792% Numbers following @columnfractions are the percent of the total3793% current hsize to be used for each column. You may use as many3794% columns as desired.379537963797% Or use a template:3798% @multitable {Column 1 template} {Column 2 template} {Column 3 template}3799% @item ...3800% using the widest term desired in each column.38013802% Each new table line starts with @item, each subsequent new column3803% starts with @tab. Empty columns may be produced by supplying @tab's3804% with nothing between them for as many times as empty columns are needed,3805% ie, @tab@tab@tab will produce two empty columns.38063807% @item, @tab do not need to be on their own lines, but it will not hurt3808% if they are.38093810% Sample multitable:38113812% @multitable {Column 1 template} {Column 2 template} {Column 3 template}3813% @item first col stuff @tab second col stuff @tab third col3814% @item3815% first col stuff3816% @tab3817% second col stuff3818% @tab3819% third col3820% @item first col stuff @tab second col stuff3821% @tab Many paragraphs of text may be used in any column.3822%3823% They will wrap at the width determined by the template.3824% @item@tab@tab This will be in third column.3825% @end multitable38263827% Default dimensions may be reset by user.3828% @multitableparskip is vertical space between paragraphs in table.3829% @multitableparindent is paragraph indent in table.3830% @multitablecolmargin is horizontal space to be left between columns.3831% @multitablelinespace is space to leave between table items, baseline3832% to baseline.3833% 0pt means it depends on current normal line spacing.3834%3835\newskip\multitableparskip3836\newskip\multitableparindent3837\newdimen\multitablecolspace3838\newskip\multitablelinespace3839\multitableparskip=0pt3840\multitableparindent=6pt3841\multitablecolspace=12pt3842\multitablelinespace=0pt38433844% Macros used to set up halign preamble:3845%3846\let\endsetuptable\relax3847\def\xendsetuptable{\endsetuptable}3848\let\columnfractions\relax3849\def\xcolumnfractions{\columnfractions}3850\newif\ifsetpercent38513852% #1 is the @columnfraction, usually a decimal number like .5, but might3853% be just 1. We just use it, whatever it is.3854%3855\def\pickupwholefraction#1 {%3856\global\advance\colcount by 13857\expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%3858\setuptable3859}38603861\newcount\colcount3862\def\setuptable#1{%3863\def\firstarg{#1}%3864\ifx\firstarg\xendsetuptable3865\let\go = \relax3866\else3867\ifx\firstarg\xcolumnfractions3868\global\setpercenttrue3869\else3870\ifsetpercent3871\let\go\pickupwholefraction3872\else3873\global\advance\colcount by 13874\setbox0=\hbox{#1\unskip\space}% Add a normal word space as a3875% separator; typically that is always in the input, anyway.3876\expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%3877\fi3878\fi3879\ifx\go\pickupwholefraction3880% Put the argument back for the \pickupwholefraction call, so3881% we'll always have a period there to be parsed.3882\def\go{\pickupwholefraction#1}%3883\else3884\let\go = \setuptable3885\fi%3886\fi3887\go3888}38893890% multitable-only commands.3891%3892% @headitem starts a heading row, which we typeset in bold.3893% Assignments have to be global since we are inside the implicit group3894% of an alignment entry. \everycr resets \everytab so we don't have to3895% undo it ourselves.3896\def\headitemfont{\b}% for people to use in the template row; not changeable3897\def\headitem{%3898\checkenv\multitable3899\crcr3900\global\everytab={\bf}% can't use \headitemfont since the parsing differs3901\the\everytab % for the first item3902}%3903%3904% A \tab used to include \hskip1sp. But then the space in a template3905% line is not enough. That is bad. So let's go back to just `&' until3906% we again encounter the problem the 1sp was intended to solve.3907% --karl, [email protected], 20apr99.3908\def\tab{\checkenv\multitable &\the\everytab}%39093910% @multitable ... @end multitable definitions:3911%3912\newtoks\everytab % insert after every tab.3913%3914\envdef\multitable{%3915\vskip\parskip3916\startsavinginserts3917%3918% @item within a multitable starts a normal row.3919% We use \def instead of \let so that if one of the multitable entries3920% contains an @itemize, we don't choke on the \item (seen as \crcr aka3921% \endtemplate) expanding \doitemize.3922\def\item{\crcr}%3923%3924\tolerance=95003925\hbadness=95003926\setmultitablespacing3927\parskip=\multitableparskip3928\parindent=\multitableparindent3929\overfullrule=0pt3930\global\colcount=03931%3932\everycr = {%3933\noalign{%3934\global\everytab={}%3935\global\colcount=0 % Reset the column counter.3936% Check for saved footnotes, etc.3937\checkinserts3938% Keeps underfull box messages off when table breaks over pages.3939%\filbreak3940% Maybe so, but it also creates really weird page breaks when the3941% table breaks over pages. Wouldn't \vfil be better? Wait until the3942% problem manifests itself, so it can be fixed for real --karl.3943}%3944}%3945%3946\parsearg\domultitable3947}3948\def\domultitable#1{%3949% To parse everything between @multitable and @item:3950\setuptable#1 \endsetuptable3951%3952% This preamble sets up a generic column definition, which will3953% be used as many times as user calls for columns.3954% \vtop will set a single line and will also let text wrap and3955% continue for many paragraphs if desired.3956\halign\bgroup &%3957\global\advance\colcount by 13958\multistrut3959\vtop{%3960% Use the current \colcount to find the correct column width:3961\hsize=\expandafter\csname col\the\colcount\endcsname3962%3963% In order to keep entries from bumping into each other3964% we will add a \leftskip of \multitablecolspace to all columns after3965% the first one.3966%3967% If a template has been used, we will add \multitablecolspace3968% to the width of each template entry.3969%3970% If the user has set preamble in terms of percent of \hsize we will3971% use that dimension as the width of the column, and the \leftskip3972% will keep entries from bumping into each other. Table will start at3973% left margin and final column will justify at right margin.3974%3975% Make sure we don't inherit \rightskip from the outer environment.3976\rightskip=0pt3977\ifnum\colcount=13978% The first column will be indented with the surrounding text.3979\advance\hsize by\leftskip3980\else3981\ifsetpercent \else3982% If user has not set preamble in terms of percent of \hsize3983% we will advance \hsize by \multitablecolspace.3984\advance\hsize by \multitablecolspace3985\fi3986% In either case we will make \leftskip=\multitablecolspace:3987\leftskip=\multitablecolspace3988\fi3989% Ignoring space at the beginning and end avoids an occasional spurious3990% blank line, when TeX decides to break the line at the space before the3991% box from the multistrut, so the strut ends up on a line by itself.3992% For example:3993% @multitable @columnfractions .11 .893994% @item @code{#}3995% @tab Legal holiday which is valid in major parts of the whole country.3996% Is automatically provided with highlighting sequences respectively3997% marking characters.3998\noindent\ignorespaces##\unskip\multistrut3999}\cr4000}4001\def\Emultitable{%4002\crcr4003\egroup % end the \halign4004\global\setpercentfalse4005}40064007\def\setmultitablespacing{%4008\def\multistrut{\strut}% just use the standard line spacing4009%4010% Compute \multitablelinespace (if not defined by user) for use in4011% \multitableparskip calculation. We used define \multistrut based on4012% this, but (ironically) that caused the spacing to be off.4013% See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.4014\ifdim\multitablelinespace=0pt4015\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip4016\global\advance\multitablelinespace by-\ht04017\fi4018% Test to see if parskip is larger than space between lines of4019% table. If not, do nothing.4020% If so, set to same dimension as multitablelinespace.4021\ifdim\multitableparskip>\multitablelinespace4022\global\multitableparskip=\multitablelinespace4023\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller4024% than skip between lines in the table.4025\fi%4026\ifdim\multitableparskip=0pt4027\global\multitableparskip=\multitablelinespace4028\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller4029% than skip between lines in the table.4030\fi}403140324033\message{conditionals,}40344035% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,4036% @ifnotxml always succeed. They currently do nothing; we don't4037% attempt to check whether the conditionals are properly nested. But we4038% have to remember that they are conditionals, so that @end doesn't4039% attempt to close an environment group.4040%4041\def\makecond#1{%4042\expandafter\let\csname #1\endcsname = \relax4043\expandafter\let\csname iscond.#1\endcsname = 14044}4045\makecond{iftex}4046\makecond{ifnotdocbook}4047\makecond{ifnothtml}4048\makecond{ifnotinfo}4049\makecond{ifnotplaintext}4050\makecond{ifnotxml}40514052% Ignore @ignore, @ifhtml, @ifinfo, and the like.4053%4054\def\direntry{\doignore{direntry}}4055\def\documentdescription{\doignore{documentdescription}}4056\def\docbook{\doignore{docbook}}4057\def\html{\doignore{html}}4058\def\ifdocbook{\doignore{ifdocbook}}4059\def\ifhtml{\doignore{ifhtml}}4060\def\ifinfo{\doignore{ifinfo}}4061\def\ifnottex{\doignore{ifnottex}}4062\def\ifplaintext{\doignore{ifplaintext}}4063\def\ifxml{\doignore{ifxml}}4064\def\ignore{\doignore{ignore}}4065\def\menu{\doignore{menu}}4066\def\xml{\doignore{xml}}40674068% Ignore text until a line `@end #1', keeping track of nested conditionals.4069%4070% A count to remember the depth of nesting.4071\newcount\doignorecount40724073\def\doignore#1{\begingroup4074% Scan in ``verbatim'' mode:4075\obeylines4076\catcode`\@ = \other4077\catcode`\{ = \other4078\catcode`\} = \other4079%4080% Make sure that spaces turn into tokens that match what \doignoretext wants.4081\spaceisspace4082%4083% Count number of #1's that we've seen.4084\doignorecount = 04085%4086% Swallow text until we reach the matching `@end #1'.4087\dodoignore{#1}%4088}40894090{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.4091\obeylines %4092%4093\gdef\dodoignore#1{%4094% #1 contains the command name as a string, e.g., `ifinfo'.4095%4096% Define a command to find the next `@end #1'.4097\long\def\doignoretext##1^^M@end #1{%4098\doignoretextyyy##1^^M@#1\_STOP_}%4099%4100% And this command to find another #1 command, at the beginning of a4101% line. (Otherwise, we would consider a line `@c @ifset', for4102% example, to count as an @ifset for nesting.)4103\long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%4104%4105% And now expand that command.4106\doignoretext ^^M%4107}%4108}41094110\def\doignoreyyy#1{%4111\def\temp{#1}%4112\ifx\temp\empty % Nothing found.4113\let\next\doignoretextzzz4114\else % Found a nested condition, ...4115\advance\doignorecount by 14116\let\next\doignoretextyyy % ..., look for another.4117% If we're here, #1 ends with ^^M\ifinfo (for example).4118\fi4119\next #1% the token \_STOP_ is present just after this macro.4120}41214122% We have to swallow the remaining "\_STOP_".4123%4124\def\doignoretextzzz#1{%4125\ifnum\doignorecount = 0 % We have just found the outermost @end.4126\let\next\enddoignore4127\else % Still inside a nested condition.4128\advance\doignorecount by -14129\let\next\doignoretext % Look for the next @end.4130\fi4131\next4132}41334134% Finish off ignored text.4135{ \obeylines%4136% Ignore anything after the last `@end #1'; this matters in verbatim4137% environments, where otherwise the newline after an ignored conditional4138% would result in a blank line in the output.4139\gdef\enddoignore#1^^M{\endgroup\ignorespaces}%4140}414141424143% @set VAR sets the variable VAR to an empty value.4144% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.4145%4146% Since we want to separate VAR from REST-OF-LINE (which might be4147% empty), we can't just use \parsearg; we have to insert a space of our4148% own to delimit the rest of the line, and then take it out again if we4149% didn't need it.4150% We rely on the fact that \parsearg sets \catcode`\ =10.4151%4152\parseargdef\set{\setyyy#1 \endsetyyy}4153\def\setyyy#1 #2\endsetyyy{%4154{%4155\makevalueexpandable4156\def\temp{#2}%4157\edef\next{\gdef\makecsname{SET#1}}%4158\ifx\temp\empty4159\next{}%4160\else4161\setzzz#2\endsetzzz4162\fi4163}%4164}4165% Remove the trailing space \setxxx inserted.4166\def\setzzz#1 \endsetzzz{\next{#1}}41674168% @clear VAR clears (i.e., unsets) the variable VAR.4169%4170\parseargdef\clear{%4171{%4172\makevalueexpandable4173\global\expandafter\let\csname SET#1\endcsname=\relax4174}%4175}41764177% @value{foo} gets the text saved in variable foo.4178\def\value{\begingroup\makevalueexpandable\valuexxx}4179\def\valuexxx#1{\expandablevalue{#1}\endgroup}4180{4181\catcode`\- = \active \catcode`\_ = \active4182%4183\gdef\makevalueexpandable{%4184\let\value = \expandablevalue4185% We don't want these characters active, ...4186\catcode`\-=\other \catcode`\_=\other4187% ..., but we might end up with active ones in the argument if4188% we're called from @code, as @code{@value{foo-bar_}}, though.4189% So \let them to their normal equivalents.4190\let-\normaldash \let_\normalunderscore4191}4192}41934194% We have this subroutine so that we can handle at least some @value's4195% properly in indexes (we call \makevalueexpandable in \indexdummies).4196% The command has to be fully expandable (if the variable is set), since4197% the result winds up in the index file. This means that if the4198% variable's value contains other Texinfo commands, it's almost certain4199% it will fail (although perhaps we could fix that with sufficient work4200% to do a one-level expansion on the result, instead of complete).4201%4202\def\expandablevalue#1{%4203\expandafter\ifx\csname SET#1\endcsname\relax4204{[No value for ``#1'']}%4205\message{Variable `#1', used in @value, is not set.}%4206\else4207\csname SET#1\endcsname4208\fi4209}42104211% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined4212% with @set.4213%4214% To get special treatment of `@end ifset,' call \makeond and the redefine.4215%4216\makecond{ifset}4217\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}4218\def\doifset#1#2{%4219{%4220\makevalueexpandable4221\let\next=\empty4222\expandafter\ifx\csname SET#2\endcsname\relax4223#1% If not set, redefine \next.4224\fi4225\expandafter4226}\next4227}4228\def\ifsetfail{\doignore{ifset}}42294230% @ifclear VAR ... @end executes the `...' iff VAR has never been4231% defined with @set, or has been undefined with @clear.4232%4233% The `\else' inside the `\doifset' parameter is a trick to reuse the4234% above code: if the variable is not set, do nothing, if it is set,4235% then redefine \next to \ifclearfail.4236%4237\makecond{ifclear}4238\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}4239\def\ifclearfail{\doignore{ifclear}}42404241% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written4242% without the @) is in fact defined. We can only feasibly check at the4243% TeX level, so something like `mathcode' is going to considered4244% defined even though it is not a Texinfo command.4245%4246\makecond{ifcommanddefined}4247\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}4248%4249\def\doifcmddefined#1#2{{%4250\makevalueexpandable4251\let\next=\empty4252\expandafter\ifx\csname #2\endcsname\relax4253#1% If not defined, \let\next as above.4254\fi4255\expandafter4256}\next4257}4258\def\ifcmddefinedfail{\doignore{ifcommanddefined}}42594260% @ifcommandnotdefined CMD ... handled similar to @ifclear above.4261\makecond{ifcommandnotdefined}4262\def\ifcommandnotdefined{%4263\parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}4264\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}42654266% Set the `txicommandconditionals' variable, so documents have a way to4267% test if the @ifcommand...defined conditionals are available.4268\set txicommandconditionals42694270% @dircategory CATEGORY -- specify a category of the dir file4271% which this file should belong to. Ignore this in TeX.4272\let\dircategory=\comment42734274% @defininfoenclose.4275\let\definfoenclose=\comment427642774278\message{indexing,}4279% Index generation facilities42804281% Define \newwrite to be identical to plain tex's \newwrite4282% except not \outer, so it can be used within macros and \if's.4283\edef\newwrite{\makecsname{ptexnewwrite}}42844285% \newindex {foo} defines an index named foo.4286% It automatically defines \fooindex such that4287% \fooindex ...rest of line... puts an entry in the index foo.4288% It also defines \fooindfile to be the number of the output channel for4289% the file that accumulates this index. The file's extension is foo.4290% The name of an index should be no more than 2 characters long4291% for the sake of vms.4292%4293\def\newindex#1{%4294\iflinks4295\expandafter\newwrite \csname#1indfile\endcsname4296\openout \csname#1indfile\endcsname \jobname.#1 % Open the file4297\fi4298\expandafter\xdef\csname#1index\endcsname{% % Define @#1index4299\noexpand\doindex{#1}}4300}43014302% @defindex foo == \newindex{foo}4303%4304\def\defindex{\parsearg\newindex}43054306% Define @defcodeindex, like @defindex except put all entries in @code.4307%4308\def\defcodeindex{\parsearg\newcodeindex}4309%4310\def\newcodeindex#1{%4311\iflinks4312\expandafter\newwrite \csname#1indfile\endcsname4313\openout \csname#1indfile\endcsname \jobname.#14314\fi4315\expandafter\xdef\csname#1index\endcsname{%4316\noexpand\docodeindex{#1}}%4317}431843194320% @synindex foo bar makes index foo feed into index bar.4321% Do this instead of @defindex foo if you don't want it as a separate index.4322%4323% @syncodeindex foo bar similar, but put all entries made for index foo4324% inside @code.4325%4326\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}4327\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}43284329% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),4330% #3 the target index (bar).4331\def\dosynindex#1#2#3{%4332% Only do \closeout if we haven't already done it, else we'll end up4333% closing the target index.4334\expandafter \ifx\csname donesynindex#2\endcsname \relax4335% The \closeout helps reduce unnecessary open files; the limit on the4336% Acorn RISC OS is a mere 16 files.4337\expandafter\closeout\csname#2indfile\endcsname4338\expandafter\let\csname donesynindex#2\endcsname = 14339\fi4340% redefine \fooindfile:4341\expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname4342\expandafter\let\csname#2indfile\endcsname=\temp4343% redefine \fooindex:4344\expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%4345}43464347% Define \doindex, the driver for all \fooindex macros.4348% Argument #1 is generated by the calling \fooindex macro,4349% and it is "foo", the name of the index.43504351% \doindex just uses \parsearg; it calls \doind for the actual work.4352% This is because \doind is more useful to call from other macros.43534354% There is also \dosubind {index}{topic}{subtopic}4355% which makes an entry in a two-level index such as the operation index.43564357\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}4358\def\singleindexer #1{\doind{\indexname}{#1}}43594360% like the previous two, but they put @code around the argument.4361\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}4362\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}43634364% Take care of Texinfo commands that can appear in an index entry.4365% Since there are some commands we want to expand, and others we don't,4366% we have to laboriously prevent expansion for those that we don't.4367%4368\def\indexdummies{%4369\escapechar = `\\ % use backslash in output files.4370\def\@{@}% change to @@ when we switch to @ as escape char in index files.4371\def\ {\realbackslash\space }%4372%4373% Need these unexpandable (because we define \tt as a dummy)4374% definitions when @{ or @} appear in index entry text. Also, more4375% complicated, when \tex is in effect and \{ is a \delimiter again.4376% We can't use \lbracecmd and \rbracecmd because texindex assumes4377% braces and backslashes are used only as delimiters. Perhaps we4378% should define @lbrace and @rbrace commands a la @comma.4379\def\{{{\tt\char123}}%4380\def\}{{\tt\char125}}%4381%4382% I don't entirely understand this, but when an index entry is4383% generated from a macro call, the \endinput which \scanmacro inserts4384% causes processing to be prematurely terminated. This is,4385% apparently, because \indexsorttmp is fully expanded, and \endinput4386% is an expandable command. The redefinition below makes \endinput4387% disappear altogether for that purpose -- although logging shows that4388% processing continues to some further point. On the other hand, it4389% seems \endinput does not hurt in the printed index arg, since that4390% is still getting written without apparent harm.4391%4392% Sample source (mac-idx3.tex, reported by Graham Percival to4393% help-texinfo, 22may06):4394% @macro funindex {WORD}4395% @findex xyz4396% @end macro4397% ...4398% @funindex commtest4399%4400% The above is not enough to reproduce the bug, but it gives the flavor.4401%4402% Sample whatsit resulting:4403% .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}4404%4405% So:4406\let\endinput = \empty4407%4408% Do the redefinitions.4409\commondummies4410}44114412% For the aux and toc files, @ is the escape character. So we want to4413% redefine everything using @ as the escape character (instead of4414% \realbackslash, still used for index files). When everything uses @,4415% this will be simpler.4416%4417\def\atdummies{%4418\def\@{@@}%4419\def\ {@ }%4420\let\{ = \lbraceatcmd4421\let\} = \rbraceatcmd4422%4423% Do the redefinitions.4424\commondummies4425\otherbackslash4426}44274428% Called from \indexdummies and \atdummies.4429%4430\def\commondummies{%4431%4432% \definedummyword defines \#1 as \string\#1\space, thus effectively4433% preventing its expansion. This is used only for control words,4434% not control letters, because the \space would be incorrect for4435% control characters, but is needed to separate the control word4436% from whatever follows.4437%4438% For control letters, we have \definedummyletter, which omits the4439% space.4440%4441% These can be used both for control words that take an argument and4442% those that do not. If it is followed by {arg} in the input, then4443% that will dutifully get written to the index (or wherever).4444%4445\def\definedummyword ##1{\def##1{\string##1\space}}%4446\def\definedummyletter##1{\def##1{\string##1}}%4447\let\definedummyaccent\definedummyletter4448%4449\commondummiesnofonts4450%4451\definedummyletter\_%4452\definedummyletter\-%4453%4454% Non-English letters.4455\definedummyword\AA4456\definedummyword\AE4457\definedummyword\DH4458\definedummyword\L4459\definedummyword\O4460\definedummyword\OE4461\definedummyword\TH4462\definedummyword\aa4463\definedummyword\ae4464\definedummyword\dh4465\definedummyword\exclamdown4466\definedummyword\l4467\definedummyword\o4468\definedummyword\oe4469\definedummyword\ordf4470\definedummyword\ordm4471\definedummyword\questiondown4472\definedummyword\ss4473\definedummyword\th4474%4475% Although these internal commands shouldn't show up, sometimes they do.4476\definedummyword\bf4477\definedummyword\gtr4478\definedummyword\hat4479\definedummyword\less4480\definedummyword\sf4481\definedummyword\sl4482\definedummyword\tclose4483\definedummyword\tt4484%4485\definedummyword\LaTeX4486\definedummyword\TeX4487%4488% Assorted special characters.4489\definedummyword\arrow4490\definedummyword\bullet4491\definedummyword\comma4492\definedummyword\copyright4493\definedummyword\registeredsymbol4494\definedummyword\dots4495\definedummyword\enddots4496\definedummyword\entrybreak4497\definedummyword\equiv4498\definedummyword\error4499\definedummyword\euro4500\definedummyword\expansion4501\definedummyword\geq4502\definedummyword\guillemetleft4503\definedummyword\guillemetright4504\definedummyword\guilsinglleft4505\definedummyword\guilsinglright4506\definedummyword\lbracechar4507\definedummyword\leq4508\definedummyword\minus4509\definedummyword\ogonek4510\definedummyword\pounds4511\definedummyword\point4512\definedummyword\print4513\definedummyword\quotedblbase4514\definedummyword\quotedblleft4515\definedummyword\quotedblright4516\definedummyword\quoteleft4517\definedummyword\quoteright4518\definedummyword\quotesinglbase4519\definedummyword\rbracechar4520\definedummyword\result4521\definedummyword\textdegree4522%4523% We want to disable all macros so that they are not expanded by \write.4524\macrolist4525%4526\normalturnoffactive4527%4528% Handle some cases of @value -- where it does not contain any4529% (non-fully-expandable) commands.4530\makevalueexpandable4531}45324533% \commondummiesnofonts: common to \commondummies and \indexnofonts.4534%4535\def\commondummiesnofonts{%4536% Control letters and accents.4537\definedummyletter\!%4538\definedummyaccent\"%4539\definedummyaccent\'%4540\definedummyletter\*%4541\definedummyaccent\,%4542\definedummyletter\.%4543\definedummyletter\/%4544\definedummyletter\:%4545\definedummyaccent\=%4546\definedummyletter\?%4547\definedummyaccent\^%4548\definedummyaccent\`%4549\definedummyaccent\~%4550\definedummyword\u4551\definedummyword\v4552\definedummyword\H4553\definedummyword\dotaccent4554\definedummyword\ogonek4555\definedummyword\ringaccent4556\definedummyword\tieaccent4557\definedummyword\ubaraccent4558\definedummyword\udotaccent4559\definedummyword\dotless4560%4561% Texinfo font commands.4562\definedummyword\b4563\definedummyword\i4564\definedummyword\r4565\definedummyword\sansserif4566\definedummyword\sc4567\definedummyword\slanted4568\definedummyword\t4569%4570% Commands that take arguments.4571\definedummyword\abbr4572\definedummyword\acronym4573\definedummyword\anchor4574\definedummyword\cite4575\definedummyword\code4576\definedummyword\command4577\definedummyword\dfn4578\definedummyword\dmn4579\definedummyword\email4580\definedummyword\emph4581\definedummyword\env4582\definedummyword\file4583\definedummyword\image4584\definedummyword\indicateurl4585\definedummyword\inforef4586\definedummyword\kbd4587\definedummyword\key4588\definedummyword\math4589\definedummyword\option4590\definedummyword\pxref4591\definedummyword\ref4592\definedummyword\samp4593\definedummyword\strong4594\definedummyword\tie4595\definedummyword\uref4596\definedummyword\url4597\definedummyword\var4598\definedummyword\verb4599\definedummyword\w4600\definedummyword\xref4601}46024603% \indexnofonts is used when outputting the strings to sort the index4604% by, and when constructing control sequence names. It eliminates all4605% control sequences and just writes whatever the best ASCII sort string4606% would be for a given command (usually its argument).4607%4608\def\indexnofonts{%4609% Accent commands should become @asis.4610\def\definedummyaccent##1{\let##1\asis}%4611% We can just ignore other control letters.4612\def\definedummyletter##1{\let##1\empty}%4613% All control words become @asis by default; overrides below.4614\let\definedummyword\definedummyaccent4615%4616\commondummiesnofonts4617%4618% Don't no-op \tt, since it isn't a user-level command4619% and is used in the definitions of the active chars like <, >, |, etc.4620% Likewise with the other plain tex font commands.4621%\let\tt=\asis4622%4623\def\ { }%4624\def\@{@}%4625\def\_{\normalunderscore}%4626\def\-{}% @- shouldn't affect sorting4627%4628% Unfortunately, texindex is not prepared to handle braces in the4629% content at all. So for index sorting, we map @{ and @} to strings4630% starting with |, since that ASCII character is between ASCII { and }.4631\def\{{|a}%4632\def\lbracechar{|a}%4633%4634\def\}{|b}%4635\def\rbracechar{|b}%4636%4637% Non-English letters.4638\def\AA{AA}%4639\def\AE{AE}%4640\def\DH{DZZ}%4641\def\L{L}%4642\def\OE{OE}%4643\def\O{O}%4644\def\TH{ZZZ}%4645\def\aa{aa}%4646\def\ae{ae}%4647\def\dh{dzz}%4648\def\exclamdown{!}%4649\def\l{l}%4650\def\oe{oe}%4651\def\ordf{a}%4652\def\ordm{o}%4653\def\o{o}%4654\def\questiondown{?}%4655\def\ss{ss}%4656\def\th{zzz}%4657%4658\def\LaTeX{LaTeX}%4659\def\TeX{TeX}%4660%4661% Assorted special characters.4662% (The following {} will end up in the sort string, but that's ok.)4663\def\arrow{->}%4664\def\bullet{bullet}%4665\def\comma{,}%4666\def\copyright{copyright}%4667\def\dots{...}%4668\def\enddots{...}%4669\def\equiv{==}%4670\def\error{error}%4671\def\euro{euro}%4672\def\expansion{==>}%4673\def\geq{>=}%4674\def\guillemetleft{<<}%4675\def\guillemetright{>>}%4676\def\guilsinglleft{<}%4677\def\guilsinglright{>}%4678\def\leq{<=}%4679\def\minus{-}%4680\def\point{.}%4681\def\pounds{pounds}%4682\def\print{-|}%4683\def\quotedblbase{"}%4684\def\quotedblleft{"}%4685\def\quotedblright{"}%4686\def\quoteleft{`}%4687\def\quoteright{'}%4688\def\quotesinglbase{,}%4689\def\registeredsymbol{R}%4690\def\result{=>}%4691\def\textdegree{o}%4692%4693\expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax4694\else \indexlquoteignore \fi4695%4696% We need to get rid of all macros, leaving only the arguments (if present).4697% Of course this is not nearly correct, but it is the best we can do for now.4698% makeinfo does not expand macros in the argument to @deffn, which ends up4699% writing an index entry, and texindex isn't prepared for an index sort entry4700% that starts with \.4701%4702% Since macro invocations are followed by braces, we can just redefine them4703% to take a single TeX argument. The case of a macro invocation that4704% goes to end-of-line is not handled.4705%4706\macrolist4707}47084709% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us4710% ignore left quotes in the sort term.4711{\catcode`\`=\active4712\gdef\indexlquoteignore{\let`=\empty}}47134714\let\indexbackslash=0 %overridden during \printindex.4715\let\SETmarginindex=\relax % put index entries in margin (undocumented)?47164717% Most index entries go through here, but \dosubind is the general case.4718% #1 is the index name, #2 is the entry text.4719\def\doind#1#2{\dosubind{#1}{#2}{}}47204721% Workhorse for all \fooindexes.4722% #1 is name of index, #2 is stuff to put there, #3 is subentry --4723% empty if called from \doind, as we usually are (the main exception4724% is with most defuns, which call us directly).4725%4726\def\dosubind#1#2#3{%4727\iflinks4728{%4729% Store the main index entry text (including the third arg).4730\toks0 = {#2}%4731% If third arg is present, precede it with a space.4732\def\thirdarg{#3}%4733\ifx\thirdarg\empty \else4734\toks0 = \expandafter{\the\toks0 \space #3}%4735\fi4736%4737\edef\writeto{\csname#1indfile\endcsname}%4738%4739\safewhatsit\dosubindwrite4740}%4741\fi4742}47434744% Write the entry in \toks0 to the index file:4745%4746\def\dosubindwrite{%4747% Put the index entry in the margin if desired.4748\ifx\SETmarginindex\relax\else4749\insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%4750\fi4751%4752% Remember, we are within a group.4753\indexdummies % Must do this here, since \bf, etc expand at this stage4754\def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now4755% so it will be output as is; and it will print as backslash.4756%4757% Process the index entry with all font commands turned off, to4758% get the string to sort by.4759{\indexnofonts4760\edef\temp{\the\toks0}% need full expansion4761\xdef\indexsorttmp{\temp}%4762}%4763%4764% Set up the complete index entry, with both the sort key and4765% the original text, including any font commands. We write4766% three arguments to \entry to the .?? file (four in the4767% subentry case), texindex reduces to two when writing the .??s4768% sorted result.4769\edef\temp{%4770\write\writeto{%4771\string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%4772}%4773\temp4774}47754776% Take care of unwanted page breaks/skips around a whatsit:4777%4778% If a skip is the last thing on the list now, preserve it4779% by backing up by \lastskip, doing the \write, then inserting4780% the skip again. Otherwise, the whatsit generated by the4781% \write or \pdfdest will make \lastskip zero. The result is that4782% sequences like this:4783% @end defun4784% @tindex whatever4785% @defun ...4786% will have extra space inserted, because the \medbreak in the4787% start of the @defun won't see the skip inserted by the @end of4788% the previous defun.4789%4790% But don't do any of this if we're not in vertical mode. We4791% don't want to do a \vskip and prematurely end a paragraph.4792%4793% Avoid page breaks due to these extra skips, too.4794%4795% But wait, there is a catch there:4796% We'll have to check whether \lastskip is zero skip. \ifdim is not4797% sufficient for this purpose, as it ignores stretch and shrink parts4798% of the skip. The only way seems to be to check the textual4799% representation of the skip.4800%4801% The following is almost like \def\zeroskipmacro{0.0pt} except that4802% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).4803%4804\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}4805%4806\newskip\whatsitskip4807\newcount\whatsitpenalty4808%4809% ..., ready, GO:4810%4811\def\safewhatsit#1{\ifhmode4812#1%4813\else4814% \lastskip and \lastpenalty cannot both be nonzero simultaneously.4815\whatsitskip = \lastskip4816\edef\lastskipmacro{\the\lastskip}%4817\whatsitpenalty = \lastpenalty4818%4819% If \lastskip is nonzero, that means the last item was a4820% skip. And since a skip is discardable, that means this4821% -\whatsitskip glue we're inserting is preceded by a4822% non-discardable item, therefore it is not a potential4823% breakpoint, therefore no \nobreak needed.4824\ifx\lastskipmacro\zeroskipmacro4825\else4826\vskip-\whatsitskip4827\fi4828%4829#1%4830%4831\ifx\lastskipmacro\zeroskipmacro4832% If \lastskip was zero, perhaps the last item was a penalty, and4833% perhaps it was >=10000, e.g., a \nobreak. In that case, we want4834% to re-insert the same penalty (values >10000 are used for various4835% signals); since we just inserted a non-discardable item, any4836% following glue (such as a \parskip) would be a breakpoint. For example:4837% @deffn deffn-whatever4838% @vindex index-whatever4839% Description.4840% would allow a break between the index-whatever whatsit4841% and the "Description." paragraph.4842\ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi4843\else4844% On the other hand, if we had a nonzero \lastskip,4845% this make-up glue would be preceded by a non-discardable item4846% (the whatsit from the \write), so we must insert a \nobreak.4847\nobreak\vskip\whatsitskip4848\fi4849\fi}48504851% The index entry written in the file actually looks like4852% \entry {sortstring}{page}{topic}4853% or4854% \entry {sortstring}{page}{topic}{subtopic}4855% The texindex program reads in these files and writes files4856% containing these kinds of lines:4857% \initial {c}4858% before the first topic whose initial is c4859% \entry {topic}{pagelist}4860% for a topic that is used without subtopics4861% \primary {topic}4862% for the beginning of a topic that is used with subtopics4863% \secondary {subtopic}{pagelist}4864% for each subtopic.48654866% Define the user-accessible indexing commands4867% @findex, @vindex, @kindex, @cindex.48684869\def\findex {\fnindex}4870\def\kindex {\kyindex}4871\def\cindex {\cpindex}4872\def\vindex {\vrindex}4873\def\tindex {\tpindex}4874\def\pindex {\pgindex}48754876\def\cindexsub {\begingroup\obeylines\cindexsub}4877{\obeylines %4878\gdef\cindexsub "#1" #2^^M{\endgroup %4879\dosubind{cp}{#2}{#1}}}48804881% Define the macros used in formatting output of the sorted index material.48824883% @printindex causes a particular index (the ??s file) to get printed.4884% It does not print any chapter heading (usually an @unnumbered).4885%4886\parseargdef\printindex{\begingroup4887\dobreak \chapheadingskip{10000}%4888%4889\smallfonts \rm4890\tolerance = 95004891\plainfrenchspacing4892\everypar = {}% don't want the \kern\-parindent from indentation suppression.4893%4894% See if the index file exists and is nonempty.4895% Change catcode of @ here so that if the index file contains4896% \initial {@}4897% as its first line, TeX doesn't complain about mismatched braces4898% (because it thinks @} is a control sequence).4899\catcode`\@ = 114900\openin 1 \jobname.#1s4901\ifeof 14902% \enddoublecolumns gets confused if there is no text in the index,4903% and it loses the chapter title and the aux file entries for the4904% index. The easiest way to prevent this problem is to make sure4905% there is some text.4906\putwordIndexNonexistent4907\else4908%4909% If the index file exists but is empty, then \openin leaves \ifeof4910% false. We have to make TeX try to read something from the file, so4911% it can discover if there is anything in it.4912\read 1 to \temp4913\ifeof 14914\putwordIndexIsEmpty4915\else4916% Index files are almost Texinfo source, but we use \ as the escape4917% character. It would be better to use @, but that's too big a change4918% to make right now.4919\def\indexbackslash{\backslashcurfont}%4920\catcode`\\ = 04921\escapechar = `\\4922\begindoublecolumns4923\input \jobname.#1s4924\enddoublecolumns4925\fi4926\fi4927\closein 14928\endgroup}49294930% These macros are used by the sorted index file itself.4931% Change them to control the appearance of the index.49324933\def\initial#1{{%4934% Some minor font changes for the special characters.4935\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt4936%4937% Remove any glue we may have, we'll be inserting our own.4938\removelastskip4939%4940% We like breaks before the index initials, so insert a bonus.4941\nobreak4942\vskip 0pt plus 3\baselineskip4943\penalty 04944\vskip 0pt plus -3\baselineskip4945%4946% Typeset the initial. Making this add up to a whole number of4947% baselineskips increases the chance of the dots lining up from column4948% to column. It still won't often be perfect, because of the stretch4949% we need before each entry, but it's better.4950%4951% No shrink because it confuses \balancecolumns.4952\vskip 1.67\baselineskip plus .5\baselineskip4953\leftline{\secbf #1}%4954% Do our best not to break after the initial.4955\nobreak4956\vskip .33\baselineskip plus .1\baselineskip4957}}49584959% \entry typesets a paragraph consisting of the text (#1), dot leaders, and4960% then page number (#2) flushed to the right margin. It is used for index4961% and table of contents entries. The paragraph is indented by \leftskip.4962%4963% A straightforward implementation would start like this:4964% \def\entry#1#2{...4965% But this freezes the catcodes in the argument, and can cause problems to4966% @code, which sets - active. This problem was fixed by a kludge---4967% ``-'' was active throughout whole index, but this isn't really right.4968% The right solution is to prevent \entry from swallowing the whole text.4969% --kasal, 21nov034970\def\entry{%4971\begingroup4972%4973% Start a new paragraph if necessary, so our assignments below can't4974% affect previous text.4975\par4976%4977% Do not fill out the last line with white space.4978\parfillskip = 0in4979%4980% No extra space above this paragraph.4981\parskip = 0in4982%4983% Do not prefer a separate line ending with a hyphen to fewer lines.4984\finalhyphendemerits = 04985%4986% \hangindent is only relevant when the entry text and page number4987% don't both fit on one line. In that case, bob suggests starting the4988% dots pretty far over on the line. Unfortunately, a large4989% indentation looks wrong when the entry text itself is broken across4990% lines. So we use a small indentation and put up with long leaders.4991%4992% \hangafter is reset to 1 (which is the value we want) at the start4993% of each paragraph, so we need not do anything with that.4994\hangindent = 2em4995%4996% When the entry text needs to be broken, just fill out the first line4997% with blank space.4998\rightskip = 0pt plus1fil4999%5000% A bit of stretch before each entry for the benefit of balancing5001% columns.5002\vskip 0pt plus1pt5003%5004% When reading the text of entry, convert explicit line breaks5005% from @* into spaces. The user might give these in long section5006% titles, for instance.5007\def\*{\unskip\space\ignorespaces}%5008\def\entrybreak{\hfil\break}%5009%5010% Swallow the left brace of the text (first parameter):5011\afterassignment\doentry5012\let\temp =5013}5014\def\entrybreak{\unskip\space\ignorespaces}%5015\def\doentry{%5016\bgroup % Instead of the swallowed brace.5017\noindent5018\aftergroup\finishentry5019% And now comes the text of the entry.5020}5021\def\finishentry#1{%5022% #1 is the page number.5023%5024% The following is kludged to not output a line of dots in the index if5025% there are no page numbers. The next person who breaks this will be5026% cursed by a Unix daemon.5027\setbox\boxA = \hbox{#1}%5028\ifdim\wd\boxA = 0pt5029\ %5030\else5031%5032% If we must, put the page number on a line of its own, and fill out5033% this line with blank space. (The \hfil is overwhelmed with the5034% fill leaders glue in \indexdotfill if the page number does fit.)5035\hfil\penalty505036\null\nobreak\indexdotfill % Have leaders before the page number.5037%5038% The `\ ' here is removed by the implicit \unskip that TeX does as5039% part of (the primitive) \par. Without it, a spurious underfull5040% \hbox ensues.5041\ifpdf5042\pdfgettoks#1.%5043\ \the\toksA5044\else5045\ #1%5046\fi5047\fi5048\par5049\endgroup5050}50515052% Like plain.tex's \dotfill, except uses up at least 1 em.5053\def\indexdotfill{\cleaders5054\hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}50555056\def\primary #1{\line{#1\hfil}}50575058\newskip\secondaryindent \secondaryindent=0.5cm5059\def\secondary#1#2{{%5060\parfillskip=0in5061\parskip=0in5062\hangindent=1in5063\hangafter=15064\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill5065\ifpdf5066\pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.5067\else5068#25069\fi5070\par5071}}50725073% Define two-column mode, which we use to typeset indexes.5074% Adapted from the TeXbook, page 416, which is to say,5075% the manmac.tex format used to print the TeXbook itself.5076\catcode`\@=1150775078\newbox\partialpage5079\newdimen\doublecolumnhsize50805081\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns5082% Grab any single-column material above us.5083\output = {%5084%5085% Here is a possibility not foreseen in manmac: if we accumulate a5086% whole lot of material, we might end up calling this \output5087% routine twice in a row (see the doublecol-lose test, which is5088% essentially a couple of indexes with @setchapternewpage off). In5089% that case we just ship out what is in \partialpage with the normal5090% output routine. Generally, \partialpage will be empty when this5091% runs and this will be a no-op. See the indexspread.tex test case.5092\ifvoid\partialpage \else5093\onepageout{\pagecontents\partialpage}%5094\fi5095%5096\global\setbox\partialpage = \vbox{%5097% Unvbox the main output page.5098\unvbox\PAGE5099\kern-\topskip \kern\baselineskip5100}%5101}%5102\eject % run that output routine to set \partialpage5103%5104% Use the double-column output routine for subsequent pages.5105\output = {\doublecolumnout}%5106%5107% Change the page size parameters. We could do this once outside this5108% routine, in each of @smallbook, @afourpaper, and the default 8.5x115109% format, but then we repeat the same computation. Repeating a couple5110% of assignments once per index is clearly meaningless for the5111% execution time, so we may as well do it in one place.5112%5113% First we halve the line length, less a little for the gutter between5114% the columns. We compute the gutter based on the line length, so it5115% changes automatically with the paper format. The magic constant5116% below is chosen so that the gutter has the same value (well, +-<1pt)5117% as it did when we hard-coded it.5118%5119% We put the result in a separate register, \doublecolumhsize, so we5120% can restore it in \pagesofar, after \hsize itself has (potentially)5121% been clobbered.5122%5123\doublecolumnhsize = \hsize5124\advance\doublecolumnhsize by -.04154\hsize5125\divide\doublecolumnhsize by 25126\hsize = \doublecolumnhsize5127%5128% Double the \vsize as well. (We don't need a separate register here,5129% since nobody clobbers \vsize.)5130\vsize = 2\vsize5131}51325133% The double-column output routine for all double-column pages except5134% the last.5135%5136\def\doublecolumnout{%5137\splittopskip=\topskip \splitmaxdepth=\maxdepth5138% Get the available space for the double columns -- the normal5139% (undoubled) page height minus any material left over from the5140% previous page.5141\dimen@ = \vsize5142\divide\dimen@ by 25143\advance\dimen@ by -\ht\partialpage5144%5145% box0 will be the left-hand column, box2 the right.5146\setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@5147\onepageout\pagesofar5148\unvbox2555149\penalty\outputpenalty5150}5151%5152% Re-output the contents of the output page -- any previous material,5153% followed by the two boxes we just split, in box0 and box2.5154\def\pagesofar{%5155\unvbox\partialpage5156%5157\hsize = \doublecolumnhsize5158\wd0=\hsize \wd2=\hsize5159\hbox to\pagewidth{\box0\hfil\box2}%5160}5161%5162% All done with double columns.5163\def\enddoublecolumns{%5164% The following penalty ensures that the page builder is exercised5165% _before_ we change the output routine. This is necessary in the5166% following situation:5167%5168% The last section of the index consists only of a single entry.5169% Before this section, \pagetotal is less than \pagegoal, so no5170% break occurs before the last section starts. However, the last5171% section, consisting of \initial and the single \entry, does not5172% fit on the page and has to be broken off. Without the following5173% penalty the page builder will not be exercised until \eject5174% below, and by that time we'll already have changed the output5175% routine to the \balancecolumns version, so the next-to-last5176% double-column page will be processed with \balancecolumns, which5177% is wrong: The two columns will go to the main vertical list, with5178% the broken-off section in the recent contributions. As soon as5179% the output routine finishes, TeX starts reconsidering the page5180% break. The two columns and the broken-off section both fit on the5181% page, because the two columns now take up only half of the page5182% goal. When TeX sees \eject from below which follows the final5183% section, it invokes the new output routine that we've set after5184% \balancecolumns below; \onepageout will try to fit the two columns5185% and the final section into the vbox of \pageheight (see5186% \pagebody), causing an overfull box.5187%5188% Note that glue won't work here, because glue does not exercise the5189% page builder, unlike penalties (see The TeXbook, pp. 280-281).5190\penalty05191%5192\output = {%5193% Split the last of the double-column material. Leave it on the5194% current page, no automatic page break.5195\balancecolumns5196%5197% If we end up splitting too much material for the current page,5198% though, there will be another page break right after this \output5199% invocation ends. Having called \balancecolumns once, we do not5200% want to call it again. Therefore, reset \output to its normal5201% definition right away. (We hope \balancecolumns will never be5202% called on to balance too much material, but if it is, this makes5203% the output somewhat more palatable.)5204\global\output = {\onepageout{\pagecontents\PAGE}}%5205}%5206\eject5207\endgroup % started in \begindoublecolumns5208%5209% \pagegoal was set to the doubled \vsize above, since we restarted5210% the current page. We're now back to normal single-column5211% typesetting, so reset \pagegoal to the normal \vsize (after the5212% \endgroup where \vsize got restored).5213\pagegoal = \vsize5214}5215%5216% Called at the end of the double column material.5217\def\balancecolumns{%5218\setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.5219\dimen@ = \ht05220\advance\dimen@ by \topskip5221\advance\dimen@ by-\baselineskip5222\divide\dimen@ by 2 % target to split to5223%debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%5224\splittopskip = \topskip5225% Loop until we get a decent breakpoint.5226{%5227\vbadness = 100005228\loop5229\global\setbox3 = \copy05230\global\setbox1 = \vsplit3 to \dimen@5231\ifdim\ht3>\dimen@5232\global\advance\dimen@ by 1pt5233\repeat5234}%5235%debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%5236\setbox0=\vbox to\dimen@{\unvbox1}%5237\setbox2=\vbox to\dimen@{\unvbox3}%5238%5239\pagesofar5240}5241\catcode`\@ = \other524252435244\message{sectioning,}5245% Chapters, sections, etc.52465247% Let's start with @part.5248\outer\parseargdef\part{\partzzz{#1}}5249\def\partzzz#1{%5250\chapoddpage5251\null5252\vskip.3\vsize % move it down on the page a bit5253\begingroup5254\noindent \titlefonts\rmisbold #1\par % the text5255\let\lastnode=\empty % no node to associate with5256\writetocentry{part}{#1}{}% but put it in the toc5257\headingsoff % no headline or footline on the part page5258\chapoddpage5259\endgroup5260}52615262% \unnumberedno is an oxymoron. But we count the unnumbered5263% sections so that we can refer to them unambiguously in the pdf5264% outlines by their "section number". We avoid collisions with chapter5265% numbers by starting them at 10000. (If a document ever has 100005266% chapters, we're in trouble anyway, I'm sure.)5267\newcount\unnumberedno \unnumberedno = 100005268\newcount\chapno5269\newcount\secno \secno=05270\newcount\subsecno \subsecno=05271\newcount\subsubsecno \subsubsecno=052725273% This counter is funny since it counts through charcodes of letters A, B, ...5274\newcount\appendixno \appendixno = `\@5275%5276% \def\appendixletter{\char\the\appendixno}5277% We do the following ugly conditional instead of the above simple5278% construct for the sake of pdftex, which needs the actual5279% letter in the expansion, not just typeset.5280%5281\def\appendixletter{%5282\ifnum\appendixno=`A A%5283\else\ifnum\appendixno=`B B%5284\else\ifnum\appendixno=`C C%5285\else\ifnum\appendixno=`D D%5286\else\ifnum\appendixno=`E E%5287\else\ifnum\appendixno=`F F%5288\else\ifnum\appendixno=`G G%5289\else\ifnum\appendixno=`H H%5290\else\ifnum\appendixno=`I I%5291\else\ifnum\appendixno=`J J%5292\else\ifnum\appendixno=`K K%5293\else\ifnum\appendixno=`L L%5294\else\ifnum\appendixno=`M M%5295\else\ifnum\appendixno=`N N%5296\else\ifnum\appendixno=`O O%5297\else\ifnum\appendixno=`P P%5298\else\ifnum\appendixno=`Q Q%5299\else\ifnum\appendixno=`R R%5300\else\ifnum\appendixno=`S S%5301\else\ifnum\appendixno=`T T%5302\else\ifnum\appendixno=`U U%5303\else\ifnum\appendixno=`V V%5304\else\ifnum\appendixno=`W W%5305\else\ifnum\appendixno=`X X%5306\else\ifnum\appendixno=`Y Y%5307\else\ifnum\appendixno=`Z Z%5308% The \the is necessary, despite appearances, because \appendixletter is5309% expanded while writing the .toc file. \char\appendixno is not5310% expandable, thus it is written literally, thus all appendixes come out5311% with the same letter (or @) in the toc without it.5312\else\char\the\appendixno5313\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi5314\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}53155316% Each @chapter defines these (using marks) as the number+name, number5317% and name of the chapter. Page headings and footings can use5318% these. @section does likewise.5319\def\thischapter{}5320\def\thischapternum{}5321\def\thischaptername{}5322\def\thissection{}5323\def\thissectionnum{}5324\def\thissectionname{}53255326\newcount\absseclevel % used to calculate proper heading level5327\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count53285329% @raisesections: treat @section as chapter, @subsection as section, etc.5330\def\raisesections{\global\advance\secbase by -1}5331\let\up=\raisesections % original BFox name53325333% @lowersections: treat @chapter as section, @section as subsection, etc.5334\def\lowersections{\global\advance\secbase by 1}5335\let\down=\lowersections % original BFox name53365337% we only have subsub.5338\chardef\maxseclevel = 35339%5340% A numbered section within an unnumbered changes to unnumbered too.5341% To achieve this, remember the "biggest" unnum. sec. we are currently in:5342\chardef\unnlevel = \maxseclevel5343%5344% Trace whether the current chapter is an appendix or not:5345% \chapheadtype is "N" or "A", unnumbered chapters are ignored.5346\def\chapheadtype{N}53475348% Choose a heading macro5349% #1 is heading type5350% #2 is heading level5351% #3 is text for heading5352\def\genhead#1#2#3{%5353% Compute the abs. sec. level:5354\absseclevel=#25355\advance\absseclevel by \secbase5356% Make sure \absseclevel doesn't fall outside the range:5357\ifnum \absseclevel < 05358\absseclevel = 05359\else5360\ifnum \absseclevel > 35361\absseclevel = 35362\fi5363\fi5364% The heading type:5365\def\headtype{#1}%5366\if \headtype U%5367\ifnum \absseclevel < \unnlevel5368\chardef\unnlevel = \absseclevel5369\fi5370\else5371% Check for appendix sections:5372\ifnum \absseclevel = 05373\edef\chapheadtype{\headtype}%5374\else5375\if \headtype A\if \chapheadtype N%5376\errmessage{@appendix... within a non-appendix chapter}%5377\fi\fi5378\fi5379% Check for numbered within unnumbered:5380\ifnum \absseclevel > \unnlevel5381\def\headtype{U}%5382\else5383\chardef\unnlevel = 35384\fi5385\fi5386% Now print the heading:5387\if \headtype U%5388\ifcase\absseclevel5389\unnumberedzzz{#3}%5390\or \unnumberedseczzz{#3}%5391\or \unnumberedsubseczzz{#3}%5392\or \unnumberedsubsubseczzz{#3}%5393\fi5394\else5395\if \headtype A%5396\ifcase\absseclevel5397\appendixzzz{#3}%5398\or \appendixsectionzzz{#3}%5399\or \appendixsubseczzz{#3}%5400\or \appendixsubsubseczzz{#3}%5401\fi5402\else5403\ifcase\absseclevel5404\chapterzzz{#3}%5405\or \seczzz{#3}%5406\or \numberedsubseczzz{#3}%5407\or \numberedsubsubseczzz{#3}%5408\fi5409\fi5410\fi5411\suppressfirstparagraphindent5412}54135414% an interface:5415\def\numhead{\genhead N}5416\def\apphead{\genhead A}5417\def\unnmhead{\genhead U}54185419% @chapter, @appendix, @unnumbered. Increment top-level counter, reset5420% all lower-level sectioning counters to zero.5421%5422% Also set \chaplevelprefix, which we prepend to @float sequence numbers5423% (e.g., figures), q.v. By default (before any chapter), that is empty.5424\let\chaplevelprefix = \empty5425%5426\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz5427\def\chapterzzz#1{%5428% section resetting is \global in case the chapter is in a group, such5429% as an @include file.5430\global\secno=0 \global\subsecno=0 \global\subsubsecno=05431\global\advance\chapno by 15432%5433% Used for \float.5434\gdef\chaplevelprefix{\the\chapno.}%5435\resetallfloatnos5436%5437% \putwordChapter can contain complex things in translations.5438\toks0=\expandafter{\putwordChapter}%5439\message{\the\toks0 \space \the\chapno}%5440%5441% Write the actual heading.5442\chapmacro{#1}{Ynumbered}{\the\chapno}%5443%5444% So @section and the like are numbered underneath this chapter.5445\global\let\section = \numberedsec5446\global\let\subsection = \numberedsubsec5447\global\let\subsubsection = \numberedsubsubsec5448}54495450\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz5451%5452\def\appendixzzz#1{%5453\global\secno=0 \global\subsecno=0 \global\subsubsecno=05454\global\advance\appendixno by 15455\gdef\chaplevelprefix{\appendixletter.}%5456\resetallfloatnos5457%5458% \putwordAppendix can contain complex things in translations.5459\toks0=\expandafter{\putwordAppendix}%5460\message{\the\toks0 \space \appendixletter}%5461%5462\chapmacro{#1}{Yappendix}{\appendixletter}%5463%5464\global\let\section = \appendixsec5465\global\let\subsection = \appendixsubsec5466\global\let\subsubsection = \appendixsubsubsec5467}54685469% normally unnmhead0 calls unnumberedzzz:5470\outer\parseargdef\unnumbered{\unnmhead0{#1}}5471\def\unnumberedzzz#1{%5472\global\secno=0 \global\subsecno=0 \global\subsubsecno=05473\global\advance\unnumberedno by 15474%5475% Since an unnumbered has no number, no prefix for figures.5476\global\let\chaplevelprefix = \empty5477\resetallfloatnos5478%5479% This used to be simply \message{#1}, but TeX fully expands the5480% argument to \message. Therefore, if #1 contained @-commands, TeX5481% expanded them. For example, in `@unnumbered The @cite{Book}', TeX5482% expanded @cite (which turns out to cause errors because \cite is meant5483% to be executed, not expanded).5484%5485% Anyway, we don't want the fully-expanded definition of @cite to appear5486% as a result of the \message, we just want `@cite' itself. We use5487% \the<toks register> to achieve this: TeX expands \the<toks> only once,5488% simply yielding the contents of <toks register>. (We also do this for5489% the toc entries.)5490\toks0 = {#1}%5491\message{(\the\toks0)}%5492%5493\chapmacro{#1}{Ynothing}{\the\unnumberedno}%5494%5495\global\let\section = \unnumberedsec5496\global\let\subsection = \unnumberedsubsec5497\global\let\subsubsection = \unnumberedsubsubsec5498}54995500% @centerchap is like @unnumbered, but the heading is centered.5501\outer\parseargdef\centerchap{%5502% Well, we could do the following in a group, but that would break5503% an assumption that \chapmacro is called at the outermost level.5504% Thus we are safer this way: --kasal, 24feb045505\let\centerparametersmaybe = \centerparameters5506\unnmhead0{#1}%5507\let\centerparametersmaybe = \relax5508}55095510% @top is like @unnumbered.5511\let\top\unnumbered55125513% Sections.5514%5515\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz5516\def\seczzz#1{%5517\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 15518\sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%5519}55205521% normally calls appendixsectionzzz:5522\outer\parseargdef\appendixsection{\apphead1{#1}}5523\def\appendixsectionzzz#1{%5524\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 15525\sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%5526}5527\let\appendixsec\appendixsection55285529% normally calls unnumberedseczzz:5530\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}5531\def\unnumberedseczzz#1{%5532\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 15533\sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%5534}55355536% Subsections.5537%5538% normally calls numberedsubseczzz:5539\outer\parseargdef\numberedsubsec{\numhead2{#1}}5540\def\numberedsubseczzz#1{%5541\global\subsubsecno=0 \global\advance\subsecno by 15542\sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%5543}55445545% normally calls appendixsubseczzz:5546\outer\parseargdef\appendixsubsec{\apphead2{#1}}5547\def\appendixsubseczzz#1{%5548\global\subsubsecno=0 \global\advance\subsecno by 15549\sectionheading{#1}{subsec}{Yappendix}%5550{\appendixletter.\the\secno.\the\subsecno}%5551}55525553% normally calls unnumberedsubseczzz:5554\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}5555\def\unnumberedsubseczzz#1{%5556\global\subsubsecno=0 \global\advance\subsecno by 15557\sectionheading{#1}{subsec}{Ynothing}%5558{\the\unnumberedno.\the\secno.\the\subsecno}%5559}55605561% Subsubsections.5562%5563% normally numberedsubsubseczzz:5564\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}5565\def\numberedsubsubseczzz#1{%5566\global\advance\subsubsecno by 15567\sectionheading{#1}{subsubsec}{Ynumbered}%5568{\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%5569}55705571% normally appendixsubsubseczzz:5572\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}5573\def\appendixsubsubseczzz#1{%5574\global\advance\subsubsecno by 15575\sectionheading{#1}{subsubsec}{Yappendix}%5576{\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%5577}55785579% normally unnumberedsubsubseczzz:5580\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}5581\def\unnumberedsubsubseczzz#1{%5582\global\advance\subsubsecno by 15583\sectionheading{#1}{subsubsec}{Ynothing}%5584{\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%5585}55865587% These macros control what the section commands do, according5588% to what kind of chapter we are in (ordinary, appendix, or unnumbered).5589% Define them by default for a numbered chapter.5590\let\section = \numberedsec5591\let\subsection = \numberedsubsec5592\let\subsubsection = \numberedsubsubsec55935594% Define @majorheading, @heading and @subheading55955596\def\majorheading{%5597{\advance\chapheadingskip by 10pt \chapbreak }%5598\parsearg\chapheadingzzz5599}56005601\def\chapheading{\chapbreak \parsearg\chapheadingzzz}5602\def\chapheadingzzz#1{%5603\vbox{\chapfonts \raggedtitlesettings #1\par}%5604\nobreak\bigskip \nobreak5605\suppressfirstparagraphindent5606}56075608% @heading, @subheading, @subsubheading.5609\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}5610\suppressfirstparagraphindent}5611\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}5612\suppressfirstparagraphindent}5613\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}5614\suppressfirstparagraphindent}56155616% These macros generate a chapter, section, etc. heading only5617% (including whitespace, linebreaking, etc. around it),5618% given all the information in convenient, parsed form.56195620% Args are the skip and penalty (usually negative)5621\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}56225623% Parameter controlling skip before chapter headings (if needed)5624\newskip\chapheadingskip56255626% Define plain chapter starts, and page on/off switching for it.5627\def\chapbreak{\dobreak \chapheadingskip {-4000}}5628\def\chappager{\par\vfill\supereject}5629% Because \domark is called before \chapoddpage, the filler page will5630% get the headings for the next chapter, which is wrong. But we don't5631% care -- we just disable all headings on the filler page.5632\def\chapoddpage{%5633\chappager5634\ifodd\pageno \else5635\begingroup5636\headingsoff5637\null5638\chappager5639\endgroup5640\fi5641}56425643\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}56445645\def\CHAPPAGoff{%5646\global\let\contentsalignmacro = \chappager5647\global\let\pchapsepmacro=\chapbreak5648\global\let\pagealignmacro=\chappager}56495650\def\CHAPPAGon{%5651\global\let\contentsalignmacro = \chappager5652\global\let\pchapsepmacro=\chappager5653\global\let\pagealignmacro=\chappager5654\global\def\HEADINGSon{\HEADINGSsingle}}56555656\def\CHAPPAGodd{%5657\global\let\contentsalignmacro = \chapoddpage5658\global\let\pchapsepmacro=\chapoddpage5659\global\let\pagealignmacro=\chapoddpage5660\global\def\HEADINGSon{\HEADINGSdouble}}56615662\CHAPPAGon56635664% Chapter opening.5665%5666% #1 is the text, #2 is the section type (Ynumbered, Ynothing,5667% Yappendix, Yomitfromtoc), #3 the chapter number.5668%5669% To test against our argument.5670\def\Ynothingkeyword{Ynothing}5671\def\Yomitfromtockeyword{Yomitfromtoc}5672\def\Yappendixkeyword{Yappendix}5673%5674\def\chapmacro#1#2#3{%5675% Insert the first mark before the heading break (see notes for \domark).5676\let\prevchapterdefs=\lastchapterdefs5677\let\prevsectiondefs=\lastsectiondefs5678\gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%5679\gdef\thissection{}}%5680%5681\def\temptype{#2}%5682\ifx\temptype\Ynothingkeyword5683\gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%5684\gdef\thischapter{\thischaptername}}%5685\else\ifx\temptype\Yomitfromtockeyword5686\gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%5687\gdef\thischapter{}}%5688\else\ifx\temptype\Yappendixkeyword5689\toks0={#1}%5690\xdef\lastchapterdefs{%5691\gdef\noexpand\thischaptername{\the\toks0}%5692\gdef\noexpand\thischapternum{\appendixletter}%5693% \noexpand\putwordAppendix avoids expanding indigestible5694% commands in some of the translations.5695\gdef\noexpand\thischapter{\noexpand\putwordAppendix{}5696\noexpand\thischapternum:5697\noexpand\thischaptername}%5698}%5699\else5700\toks0={#1}%5701\xdef\lastchapterdefs{%5702\gdef\noexpand\thischaptername{\the\toks0}%5703\gdef\noexpand\thischapternum{\the\chapno}%5704% \noexpand\putwordChapter avoids expanding indigestible5705% commands in some of the translations.5706\gdef\noexpand\thischapter{\noexpand\putwordChapter{}5707\noexpand\thischapternum:5708\noexpand\thischaptername}%5709}%5710\fi\fi\fi5711%5712% Output the mark. Pass it through \safewhatsit, to take care of5713% the preceding space.5714\safewhatsit\domark5715%5716% Insert the chapter heading break.5717\pchapsepmacro5718%5719% Now the second mark, after the heading break. No break points5720% between here and the heading.5721\let\prevchapterdefs=\lastchapterdefs5722\let\prevsectiondefs=\lastsectiondefs5723\domark5724%5725{%5726\chapfonts \rmisbold5727%5728% Have to define \lastsection before calling \donoderef, because the5729% xref code eventually uses it. On the other hand, it has to be called5730% after \pchapsepmacro, or the headline will change too soon.5731\gdef\lastsection{#1}%5732%5733% Only insert the separating space if we have a chapter/appendix5734% number, and don't print the unnumbered ``number''.5735\ifx\temptype\Ynothingkeyword5736\setbox0 = \hbox{}%5737\def\toctype{unnchap}%5738\else\ifx\temptype\Yomitfromtockeyword5739\setbox0 = \hbox{}% contents like unnumbered, but no toc entry5740\def\toctype{omit}%5741\else\ifx\temptype\Yappendixkeyword5742\setbox0 = \hbox{\putwordAppendix{} #3\enspace}%5743\def\toctype{app}%5744\else5745\setbox0 = \hbox{#3\enspace}%5746\def\toctype{numchap}%5747\fi\fi\fi5748%5749% Write the toc entry for this chapter. Must come before the5750% \donoderef, because we include the current node name in the toc5751% entry, and \donoderef resets it to empty.5752\writetocentry{\toctype}{#1}{#3}%5753%5754% For pdftex, we have to write out the node definition (aka, make5755% the pdfdest) after any page break, but before the actual text has5756% been typeset. If the destination for the pdf outline is after the5757% text, then jumping from the outline may wind up with the text not5758% being visible, for instance under high magnification.5759\donoderef{#2}%5760%5761% Typeset the actual heading.5762\nobreak % Avoid page breaks at the interline glue.5763\vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe5764\unhbox0 #1\par}%5765}%5766\nobreak\bigskip % no page break after a chapter title5767\nobreak5768}57695770% @centerchap -- centered and unnumbered.5771\let\centerparametersmaybe = \relax5772\def\centerparameters{%5773\advance\rightskip by 3\rightskip5774\leftskip = \rightskip5775\parfillskip = 0pt5776}577757785779% I don't think this chapter style is supported any more, so I'm not5780% updating it with the new noderef stuff. We'll see. --karl, 11aug03.5781%5782\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}5783%5784\def\unnchfopen #1{%5785\chapoddpage5786\vbox{\chapfonts \raggedtitlesettings #1\par}%5787\nobreak\bigskip\nobreak5788}5789\def\chfopen #1#2{\chapoddpage {\chapfonts5790\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%5791\par\penalty 5000 %5792}5793\def\centerchfopen #1{%5794\chapoddpage5795\vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}%5796\nobreak\bigskip \nobreak5797}5798\def\CHAPFopen{%5799\global\let\chapmacro=\chfopen5800\global\let\centerchapmacro=\centerchfopen}580158025803% Section titles. These macros combine the section number parts and5804% call the generic \sectionheading to do the printing.5805%5806\newskip\secheadingskip5807\def\secheadingbreak{\dobreak \secheadingskip{-1000}}58085809% Subsection titles.5810\newskip\subsecheadingskip5811\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}58125813% Subsubsection titles.5814\def\subsubsecheadingskip{\subsecheadingskip}5815\def\subsubsecheadingbreak{\subsecheadingbreak}581658175818% Print any size, any type, section title.5819%5820% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is5821% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the5822% section number.5823%5824\def\seckeyword{sec}5825%5826\def\sectionheading#1#2#3#4{%5827{%5828\checkenv{}% should not be in an environment.5829%5830% Switch to the right set of fonts.5831\csname #2fonts\endcsname \rmisbold5832%5833\def\sectionlevel{#2}%5834\def\temptype{#3}%5835%5836% Insert first mark before the heading break (see notes for \domark).5837\let\prevsectiondefs=\lastsectiondefs5838\ifx\temptype\Ynothingkeyword5839\ifx\sectionlevel\seckeyword5840\gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%5841\gdef\thissection{\thissectionname}}%5842\fi5843\else\ifx\temptype\Yomitfromtockeyword5844% Don't redefine \thissection.5845\else\ifx\temptype\Yappendixkeyword5846\ifx\sectionlevel\seckeyword5847\toks0={#1}%5848\xdef\lastsectiondefs{%5849\gdef\noexpand\thissectionname{\the\toks0}%5850\gdef\noexpand\thissectionnum{#4}%5851% \noexpand\putwordSection avoids expanding indigestible5852% commands in some of the translations.5853\gdef\noexpand\thissection{\noexpand\putwordSection{}5854\noexpand\thissectionnum:5855\noexpand\thissectionname}%5856}%5857\fi5858\else5859\ifx\sectionlevel\seckeyword5860\toks0={#1}%5861\xdef\lastsectiondefs{%5862\gdef\noexpand\thissectionname{\the\toks0}%5863\gdef\noexpand\thissectionnum{#4}%5864% \noexpand\putwordSection avoids expanding indigestible5865% commands in some of the translations.5866\gdef\noexpand\thissection{\noexpand\putwordSection{}5867\noexpand\thissectionnum:5868\noexpand\thissectionname}%5869}%5870\fi5871\fi\fi\fi5872%5873% Go into vertical mode. Usually we'll already be there, but we5874% don't want the following whatsit to end up in a preceding paragraph5875% if the document didn't happen to have a blank line.5876\par5877%5878% Output the mark. Pass it through \safewhatsit, to take care of5879% the preceding space.5880\safewhatsit\domark5881%5882% Insert space above the heading.5883\csname #2headingbreak\endcsname5884%5885% Now the second mark, after the heading break. No break points5886% between here and the heading.5887\let\prevsectiondefs=\lastsectiondefs5888\domark5889%5890% Only insert the space after the number if we have a section number.5891\ifx\temptype\Ynothingkeyword5892\setbox0 = \hbox{}%5893\def\toctype{unn}%5894\gdef\lastsection{#1}%5895\else\ifx\temptype\Yomitfromtockeyword5896% for @headings -- no section number, don't include in toc,5897% and don't redefine \lastsection.5898\setbox0 = \hbox{}%5899\def\toctype{omit}%5900\let\sectionlevel=\empty5901\else\ifx\temptype\Yappendixkeyword5902\setbox0 = \hbox{#4\enspace}%5903\def\toctype{app}%5904\gdef\lastsection{#1}%5905\else5906\setbox0 = \hbox{#4\enspace}%5907\def\toctype{num}%5908\gdef\lastsection{#1}%5909\fi\fi\fi5910%5911% Write the toc entry (before \donoderef). See comments in \chapmacro.5912\writetocentry{\toctype\sectionlevel}{#1}{#4}%5913%5914% Write the node reference (= pdf destination for pdftex).5915% Again, see comments in \chapmacro.5916\donoderef{#3}%5917%5918% Interline glue will be inserted when the vbox is completed.5919% That glue will be a valid breakpoint for the page, since it'll be5920% preceded by a whatsit (usually from the \donoderef, or from the5921% \writetocentry if there was no node). We don't want to allow that5922% break, since then the whatsits could end up on page n while the5923% section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.5924\nobreak5925%5926% Output the actual section heading.5927\vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright5928\hangindent=\wd0 % zero if no section number5929\unhbox0 #1}%5930}%5931% Add extra space after the heading -- half of whatever came above it.5932% Don't allow stretch, though.5933\kern .5 \csname #2headingskip\endcsname5934%5935% Do not let the kern be a potential breakpoint, as it would be if it5936% was followed by glue.5937\nobreak5938%5939% We'll almost certainly start a paragraph next, so don't let that5940% glue accumulate. (Not a breakpoint because it's preceded by a5941% discardable item.) However, when a paragraph is not started next5942% (\startdefun, \cartouche, \center, etc.), this needs to be wiped out5943% or the negative glue will cause weirdly wrong output, typically5944% obscuring the section heading with something else.5945\vskip-\parskip5946%5947% This is so the last item on the main vertical list is a known5948% \penalty > 10000, so \startdefun, etc., can recognize the situation5949% and do the needful.5950\penalty 100015951}595259535954\message{toc,}5955% Table of contents.5956\newwrite\tocfile59575958% Write an entry to the toc file, opening it if necessary.5959% Called from @chapter, etc.5960%5961% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}5962% We append the current node name (if any) and page number as additional5963% arguments for the \{chap,sec,...}entry macros which will eventually5964% read this. The node name is used in the pdf outlines as the5965% destination to jump to.5966%5967% We open the .toc file for writing here instead of at @setfilename (or5968% any other fixed time) so that @contents can be anywhere in the document.5969% But if #1 is `omit', then we don't do anything. This is used for the5970% table of contents chapter openings themselves.5971%5972\newif\iftocfileopened5973\def\omitkeyword{omit}%5974%5975\def\writetocentry#1#2#3{%5976\edef\writetoctype{#1}%5977\ifx\writetoctype\omitkeyword \else5978\iftocfileopened\else5979\immediate\openout\tocfile = \jobname.toc5980\global\tocfileopenedtrue5981\fi5982%5983\iflinks5984{\atdummies5985\edef\temp{%5986\write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%5987\temp5988}%5989\fi5990\fi5991%5992% Tell \shipout to create a pdf destination on each page, if we're5993% writing pdf. These are used in the table of contents. We can't5994% just write one on every page because the title pages are numbered5995% 1 and 2 (the page numbers aren't printed), and so are the first5996% two pages of the document. Thus, we'd have two destinations named5997% `1', and two named `2'.5998\ifpdf \global\pdfmakepagedesttrue \fi5999}600060016002% These characters do not print properly in the Computer Modern roman6003% fonts, so we must take special care. This is more or less redundant6004% with the Texinfo input format setup at the end of this file.6005%6006\def\activecatcodes{%6007\catcode`\"=\active6008\catcode`\$=\active6009\catcode`\<=\active6010\catcode`\>=\active6011\catcode`\\=\active6012\catcode`\^=\active6013\catcode`\_=\active6014\catcode`\|=\active6015\catcode`\~=\active6016}601760186019% Read the toc file, which is essentially Texinfo input.6020\def\readtocfile{%6021\setupdatafile6022\activecatcodes6023\input \tocreadfilename6024}60256026\newskip\contentsrightmargin \contentsrightmargin=1in6027\newcount\savepageno6028\newcount\lastnegativepageno \lastnegativepageno = -160296030% Prepare to read what we've written to \tocfile.6031%6032\def\startcontents#1{%6033% If @setchapternewpage on, and @headings double, the contents should6034% start on an odd page, unlike chapters. Thus, we maintain6035% \contentsalignmacro in parallel with \pagealignmacro.6036% From: Torbjorn Granlund <[email protected]>6037\contentsalignmacro6038\immediate\closeout\tocfile6039%6040% Don't need to put `Contents' or `Short Contents' in the headline.6041% It is abundantly clear what they are.6042\chapmacro{#1}{Yomitfromtoc}{}%6043%6044\savepageno = \pageno6045\begingroup % Set up to handle contents files properly.6046\raggedbottom % Worry more about breakpoints than the bottom.6047\advance\hsize by -\contentsrightmargin % Don't use the full line length.6048%6049% Roman numerals for page numbers.6050\ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi6051}60526053% redefined for the two-volume lispref. We always output on6054% \jobname.toc even if this is redefined.6055%6056\def\tocreadfilename{\jobname.toc}60576058% Normal (long) toc.6059%6060\def\contents{%6061\startcontents{\putwordTOC}%6062\openin 1 \tocreadfilename\space6063\ifeof 1 \else6064\readtocfile6065\fi6066\vfill \eject6067\contentsalignmacro % in case @setchapternewpage odd is in effect6068\ifeof 1 \else6069\pdfmakeoutlines6070\fi6071\closein 16072\endgroup6073\lastnegativepageno = \pageno6074\global\pageno = \savepageno6075}60766077% And just the chapters.6078\def\summarycontents{%6079\startcontents{\putwordShortTOC}%6080%6081\let\partentry = \shortpartentry6082\let\numchapentry = \shortchapentry6083\let\appentry = \shortchapentry6084\let\unnchapentry = \shortunnchapentry6085% We want a true roman here for the page numbers.6086\secfonts6087\let\rm=\shortcontrm \let\bf=\shortcontbf6088\let\sl=\shortcontsl \let\tt=\shortconttt6089\rm6090\hyphenpenalty = 100006091\advance\baselineskip by 1pt % Open it up a little.6092\def\numsecentry##1##2##3##4{}6093\let\appsecentry = \numsecentry6094\let\unnsecentry = \numsecentry6095\let\numsubsecentry = \numsecentry6096\let\appsubsecentry = \numsecentry6097\let\unnsubsecentry = \numsecentry6098\let\numsubsubsecentry = \numsecentry6099\let\appsubsubsecentry = \numsecentry6100\let\unnsubsubsecentry = \numsecentry6101\openin 1 \tocreadfilename\space6102\ifeof 1 \else6103\readtocfile6104\fi6105\closein 16106\vfill \eject6107\contentsalignmacro % in case @setchapternewpage odd is in effect6108\endgroup6109\lastnegativepageno = \pageno6110\global\pageno = \savepageno6111}6112\let\shortcontents = \summarycontents61136114% Typeset the label for a chapter or appendix for the short contents.6115% The arg is, e.g., `A' for an appendix, or `3' for a chapter.6116%6117\def\shortchaplabel#1{%6118% This space should be enough, since a single number is .5em, and the6119% widest letter (M) is 1em, at least in the Computer Modern fonts.6120% But use \hss just in case.6121% (This space doesn't include the extra space that gets added after6122% the label; that gets put in by \shortchapentry above.)6123%6124% We'd like to right-justify chapter numbers, but that looks strange6125% with appendix letters. And right-justifying numbers and6126% left-justifying letters looks strange when there is less than 106127% chapters. Have to read the whole toc once to know how many chapters6128% there are before deciding ...6129\hbox to 1em{#1\hss}%6130}61316132% These macros generate individual entries in the table of contents.6133% The first argument is the chapter or section name.6134% The last argument is the page number.6135% The arguments in between are the chapter number, section number, ...61366137% Parts, in the main contents. Replace the part number, which doesn't6138% exist, with an empty box. Let's hope all the numbers have the same width.6139% Also ignore the page number, which is conventionally not printed.6140\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}6141\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}}6142%6143% Parts, in the short toc.6144\def\shortpartentry#1#2#3#4{%6145\penalty-3006146\vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip6147\shortchapentry{{\bf #1}}{\numeralbox}{}{}%6148}61496150% Chapters, in the main contents.6151\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}6152%6153% Chapters, in the short toc.6154% See comments in \dochapentry re vbox and related settings.6155\def\shortchapentry#1#2#3#4{%6156\tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%6157}61586159% Appendices, in the main contents.6160% Need the word Appendix, and a fixed-size box.6161%6162\def\appendixbox#1{%6163% We use M since it's probably the widest letter.6164\setbox0 = \hbox{\putwordAppendix{} M}%6165\hbox to \wd0{\putwordAppendix{} #1\hss}}6166%6167\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}61686169% Unnumbered chapters.6170\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}6171\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}61726173% Sections.6174\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}6175\let\appsecentry=\numsecentry6176\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}61776178% Subsections.6179\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}6180\let\appsubsecentry=\numsubsecentry6181\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}61826183% And subsubsections.6184\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}6185\let\appsubsubsecentry=\numsubsubsecentry6186\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}61876188% This parameter controls the indentation of the various levels.6189% Same as \defaultparindent.6190\newdimen\tocindent \tocindent = 15pt61916192% Now for the actual typesetting. In all these, #1 is the text and #2 is the6193% page number.6194%6195% If the toc has to be broken over pages, we want it to be at chapters6196% if at all possible; hence the \penalty.6197\def\dochapentry#1#2{%6198\penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip6199\begingroup6200\chapentryfonts6201\tocentry{#1}{\dopageno\bgroup#2\egroup}%6202\endgroup6203\nobreak\vskip .25\baselineskip plus.1\baselineskip6204}62056206\def\dosecentry#1#2{\begingroup6207\secentryfonts \leftskip=\tocindent6208\tocentry{#1}{\dopageno\bgroup#2\egroup}%6209\endgroup}62106211\def\dosubsecentry#1#2{\begingroup6212\subsecentryfonts \leftskip=2\tocindent6213\tocentry{#1}{\dopageno\bgroup#2\egroup}%6214\endgroup}62156216\def\dosubsubsecentry#1#2{\begingroup6217\subsubsecentryfonts \leftskip=3\tocindent6218\tocentry{#1}{\dopageno\bgroup#2\egroup}%6219\endgroup}62206221% We use the same \entry macro as for the index entries.6222\let\tocentry = \entry62236224% Space between chapter (or whatever) number and the title.6225\def\labelspace{\hskip1em \relax}62266227\def\dopageno#1{{\rm #1}}6228\def\doshortpageno#1{{\rm #1}}62296230\def\chapentryfonts{\secfonts \rm}6231\def\secentryfonts{\textfonts}6232\def\subsecentryfonts{\textfonts}6233\def\subsubsecentryfonts{\textfonts}623462356236\message{environments,}6237% @foo ... @end foo.62386239% @tex ... @end tex escapes into raw TeX temporarily.6240% One exception: @ is still an escape character, so that @end tex works.6241% But \@ or @@ will get a plain @ character.62426243\envdef\tex{%6244\setupmarkupstyle{tex}%6245\catcode `\\=0 \catcode `\{=1 \catcode `\}=26246\catcode `\$=3 \catcode `\&=4 \catcode `\#=66247\catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie6248\catcode `\%=146249\catcode `\+=\other6250\catcode `\"=\other6251\catcode `\|=\other6252\catcode `\<=\other6253\catcode `\>=\other6254\catcode`\`=\other6255\catcode`\'=\other6256\escapechar=`\\6257%6258% ' is active in math mode (mathcode"8000). So reset it, and all our6259% other math active characters (just in case), to plain's definitions.6260\mathactive6261%6262\let\b=\ptexb6263\let\bullet=\ptexbullet6264\let\c=\ptexc6265\let\,=\ptexcomma6266\let\.=\ptexdot6267\let\dots=\ptexdots6268\let\equiv=\ptexequiv6269\let\!=\ptexexclam6270\let\i=\ptexi6271\let\indent=\ptexindent6272\let\noindent=\ptexnoindent6273\let\{=\ptexlbrace6274\let\+=\tabalign6275\let\}=\ptexrbrace6276\let\/=\ptexslash6277\let\*=\ptexstar6278\let\t=\ptext6279\expandafter \let\csname top\endcsname=\ptextop % outer6280\let\frenchspacing=\plainfrenchspacing6281%6282\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%6283\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%6284\def\@{@}%6285}6286% There is no need to define \Etex.62876288% Define @lisp ... @end lisp.6289% @lisp environment forms a group so it can rebind things,6290% including the definition of @end lisp (which normally is erroneous).62916292% Amount to narrow the margins by for @lisp.6293\newskip\lispnarrowing \lispnarrowing=0.4in62946295% This is the definition that ^^M gets inside @lisp, @example, and other6296% such environments. \null is better than a space, since it doesn't6297% have any width.6298\def\lisppar{\null\endgraf}62996300% This space is always present above and below environments.6301\newskip\envskipamount \envskipamount = 0pt63026303% Make spacing and below environment symmetrical. We use \parskip here6304% to help in doing that, since in @example-like environments \parskip6305% is reset to zero; thus the \afterenvbreak inserts no space -- but the6306% start of the next paragraph will insert \parskip.6307%6308\def\aboveenvbreak{{%6309% =10000 instead of <10000 because of a special case in \itemzzz and6310% \sectionheading, q.v.6311\ifnum \lastpenalty=10000 \else6312\advance\envskipamount by \parskip6313\endgraf6314\ifdim\lastskip<\envskipamount6315\removelastskip6316% it's not a good place to break if the last penalty was \nobreak6317% or better ...6318\ifnum\lastpenalty<10000 \penalty-50 \fi6319\vskip\envskipamount6320\fi6321\fi6322}}63236324\let\afterenvbreak = \aboveenvbreak63256326% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will6327% also clear it, so that its embedded environments do the narrowing again.6328\let\nonarrowing=\relax63296330% @cartouche ... @end cartouche: draw rectangle w/rounded corners around6331% environment contents.6332\font\circle=lcircle106333\newdimen\circthick6334\newdimen\cartouter\newdimen\cartinner6335\newskip\normbskip\newskip\normpskip\newskip\normlskip6336\circthick=\fontdimen8\circle6337%6338\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth6339\def\ctr{{\hskip 6pt\circle\char'010}}6340\def\cbl{{\circle\char'012\hskip -6pt}}6341\def\cbr{{\hskip 6pt\circle\char'011}}6342\def\carttop{\hbox to \cartouter{\hskip\lskip6343\ctl\leaders\hrule height\circthick\hfil\ctr6344\hskip\rskip}}6345\def\cartbot{\hbox to \cartouter{\hskip\lskip6346\cbl\leaders\hrule height\circthick\hfil\cbr6347\hskip\rskip}}6348%6349\newskip\lskip\newskip\rskip63506351\envdef\cartouche{%6352\ifhmode\par\fi % can't be in the midst of a paragraph.6353\startsavinginserts6354\lskip=\leftskip \rskip=\rightskip6355\leftskip=0pt\rightskip=0pt % we want these *outside*.6356\cartinner=\hsize \advance\cartinner by-\lskip6357\advance\cartinner by-\rskip6358\cartouter=\hsize6359\advance\cartouter by 18.4pt % allow for 3pt kerns on either6360% side, and for 6pt waste from6361% each corner char, and rule thickness6362\normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip6363% Flag to tell @lisp, etc., not to narrow margin.6364\let\nonarrowing = t%6365%6366% If this cartouche directly follows a sectioning command, we need the6367% \parskip glue (backspaced over by default) or the cartouche can6368% collide with the section heading.6369\ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi6370%6371\vbox\bgroup6372\baselineskip=0pt\parskip=0pt\lineskip=0pt6373\carttop6374\hbox\bgroup6375\hskip\lskip6376\vrule\kern3pt6377\vbox\bgroup6378\kern3pt6379\hsize=\cartinner6380\baselineskip=\normbskip6381\lineskip=\normlskip6382\parskip=\normpskip6383\vskip -\parskip6384\comment % For explanation, see the end of def\group.6385}6386\def\Ecartouche{%6387\ifhmode\par\fi6388\kern3pt6389\egroup6390\kern3pt\vrule6391\hskip\rskip6392\egroup6393\cartbot6394\egroup6395\checkinserts6396}639763986399% This macro is called at the beginning of all the @example variants,6400% inside a group.6401\newdimen\nonfillparindent6402\def\nonfillstart{%6403\aboveenvbreak6404\hfuzz = 12pt % Don't be fussy6405\sepspaces % Make spaces be word-separators rather than space tokens.6406\let\par = \lisppar % don't ignore blank lines6407\obeylines % each line of input is a line of output6408\parskip = 0pt6409% Turn off paragraph indentation but redefine \indent to emulate6410% the normal \indent.6411\nonfillparindent=\parindent6412\parindent = 0pt6413\let\indent\nonfillindent6414%6415\emergencystretch = 0pt % don't try to avoid overfull boxes6416\ifx\nonarrowing\relax6417\advance \leftskip by \lispnarrowing6418\exdentamount=\lispnarrowing6419\else6420\let\nonarrowing = \relax6421\fi6422\let\exdent=\nofillexdent6423}64246425\begingroup6426\obeyspaces6427% We want to swallow spaces (but not other tokens) after the fake6428% @indent in our nonfill-environments, where spaces are normally6429% active and set to @tie, resulting in them not being ignored after6430% @indent.6431\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%6432\gdef\nonfillindentcheck{%6433\ifx\temp %6434\expandafter\nonfillindentgobble%6435\else%6436\leavevmode\nonfillindentbox%6437\fi%6438}%6439\endgroup6440\def\nonfillindentgobble#1{\nonfillindent}6441\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}64426443% If you want all examples etc. small: @set dispenvsize small.6444% If you want even small examples the full size: @set dispenvsize nosmall.6445% This affects the following displayed environments:6446% @example, @display, @format, @lisp6447%6448\def\smallword{small}6449\def\nosmallword{nosmall}6450\let\SETdispenvsize\relax6451\def\setnormaldispenv{%6452\ifx\SETdispenvsize\smallword6453% end paragraph for sake of leading, in case document has no blank6454% line. This is redundant with what happens in \aboveenvbreak, but6455% we need to do it before changing the fonts, and it's inconvenient6456% to change the fonts afterward.6457\ifnum \lastpenalty=10000 \else \endgraf \fi6458\smallexamplefonts \rm6459\fi6460}6461\def\setsmalldispenv{%6462\ifx\SETdispenvsize\nosmallword6463\else6464\ifnum \lastpenalty=10000 \else \endgraf \fi6465\smallexamplefonts \rm6466\fi6467}64686469% We often define two environments, @foo and @smallfoo.6470% Let's do it in one command. #1 is the env name, #2 the definition.6471\def\makedispenvdef#1#2{%6472\expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%6473\expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%6474\expandafter\let\csname E#1\endcsname \afterenvbreak6475\expandafter\let\csname Esmall#1\endcsname \afterenvbreak6476}64776478% Define two environment synonyms (#1 and #2) for an environment.6479\def\maketwodispenvdef#1#2#3{%6480\makedispenvdef{#1}{#3}%6481\makedispenvdef{#2}{#3}%6482}6483%6484% @lisp: indented, narrowed, typewriter font;6485% @example: same as @lisp.6486%6487% @smallexample and @smalllisp: use smaller fonts.6488% Originally contributed by Pavel@xerox.6489%6490\maketwodispenvdef{lisp}{example}{%6491\nonfillstart6492\tt\setupmarkupstyle{example}%6493\let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.6494\gobble % eat return6495}6496% @display/@smalldisplay: same as @lisp except keep current font.6497%6498\makedispenvdef{display}{%6499\nonfillstart6500\gobble6501}65026503% @format/@smallformat: same as @display except don't narrow margins.6504%6505\makedispenvdef{format}{%6506\let\nonarrowing = t%6507\nonfillstart6508\gobble6509}65106511% @flushleft: same as @format, but doesn't obey \SETdispenvsize.6512\envdef\flushleft{%6513\let\nonarrowing = t%6514\nonfillstart6515\gobble6516}6517\let\Eflushleft = \afterenvbreak65186519% @flushright.6520%6521\envdef\flushright{%6522\let\nonarrowing = t%6523\nonfillstart6524\advance\leftskip by 0pt plus 1fill\relax6525\gobble6526}6527\let\Eflushright = \afterenvbreak652865296530% @raggedright does more-or-less normal line breaking but no right6531% justification. From plain.tex.6532\envdef\raggedright{%6533\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax6534}6535\let\Eraggedright\par65366537\envdef\raggedleft{%6538\parindent=0pt \leftskip0pt plus2em6539\spaceskip.3333em \xspaceskip.5em \parfillskip=0pt6540\hbadness=10000 % Last line will usually be underfull, so turn off6541% badness reporting.6542}6543\let\Eraggedleft\par65446545\envdef\raggedcenter{%6546\parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em6547\spaceskip.3333em \xspaceskip.5em \parfillskip=0pt6548\hbadness=10000 % Last line will usually be underfull, so turn off6549% badness reporting.6550}6551\let\Eraggedcenter\par655265536554% @quotation does normal linebreaking (hence we can't use \nonfillstart)6555% and narrows the margins. We keep \parskip nonzero in general, since6556% we're doing normal filling. So, when using \aboveenvbreak and6557% \afterenvbreak, temporarily make \parskip 0.6558%6559\makedispenvdef{quotation}{\quotationstart}6560%6561\def\quotationstart{%6562\indentedblockstart % same as \indentedblock, but increase right margin too.6563\ifx\nonarrowing\relax6564\advance\rightskip by \lispnarrowing6565\fi6566\parsearg\quotationlabel6567}65686569% We have retained a nonzero parskip for the environment, since we're6570% doing normal filling.6571%6572\def\Equotation{%6573\par6574\ifx\quotationauthor\thisisundefined\else6575% indent a bit.6576\leftline{\kern 2\leftskip \sl ---\quotationauthor}%6577\fi6578{\parskip=0pt \afterenvbreak}%6579}6580\def\Esmallquotation{\Equotation}65816582% If we're given an argument, typeset it in bold with a colon after.6583\def\quotationlabel#1{%6584\def\temp{#1}%6585\ifx\temp\empty \else6586{\bf #1: }%6587\fi6588}65896590% @indentedblock is like @quotation, but indents only on the left and6591% has no optional argument.6592%6593\makedispenvdef{indentedblock}{\indentedblockstart}6594%6595\def\indentedblockstart{%6596{\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip6597\parindent=0pt6598%6599% @cartouche defines \nonarrowing to inhibit narrowing at next level down.6600\ifx\nonarrowing\relax6601\advance\leftskip by \lispnarrowing6602\exdentamount = \lispnarrowing6603\else6604\let\nonarrowing = \relax6605\fi6606}66076608% Keep a nonzero parskip for the environment, since we're doing normal filling.6609%6610\def\Eindentedblock{%6611\par6612{\parskip=0pt \afterenvbreak}%6613}6614\def\Esmallindentedblock{\Eindentedblock}661566166617% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}6618% If we want to allow any <char> as delimiter,6619% we need the curly braces so that makeinfo sees the @verb command, eg:6620% `@verbx...x' would look like the '@verbx' command. [email protected]6621%6622% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.6623%6624% [Knuth] p.344; only we need to do the other characters Texinfo sets6625% active too. Otherwise, they get lost as the first character on a6626% verbatim line.6627\def\dospecials{%6628\do\ \do\\\do\{\do\}\do\$\do\&%6629\do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%6630\do\<\do\>\do\|\do\@\do+\do\"%6631% Don't do the quotes -- if we do, @set txicodequoteundirected and6632% @set txicodequotebacktick will not have effect on @verb and6633% @verbatim, and ?` and !` ligatures won't get disabled.6634%\do\`\do\'%6635}6636%6637% [Knuth] p. 3806638\def\uncatcodespecials{%6639\def\do##1{\catcode`##1=\other}\dospecials}6640%6641% Setup for the @verb command.6642%6643% Eight spaces for a tab6644\begingroup6645\catcode`\^^I=\active6646\gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}6647\endgroup6648%6649\def\setupverb{%6650\tt % easiest (and conventionally used) font for verbatim6651\def\par{\leavevmode\endgraf}%6652\setupmarkupstyle{verb}%6653\tabeightspaces6654% Respect line breaks,6655% print special symbols as themselves, and6656% make each space count6657% must do in this order:6658\obeylines \uncatcodespecials \sepspaces6659}66606661% Setup for the @verbatim environment6662%6663% Real tab expansion.6664\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount6665%6666% We typeset each line of the verbatim in an \hbox, so we can handle6667% tabs. The \global is in case the verbatim line starts with an accent,6668% or some other command that starts with a begin-group. Otherwise, the6669% entire \verbbox would disappear at the corresponding end-group, before6670% it is typeset. Meanwhile, we can't have nested verbatim commands6671% (can we?), so the \global won't be overwriting itself.6672\newbox\verbbox6673\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}6674%6675\begingroup6676\catcode`\^^I=\active6677\gdef\tabexpand{%6678\catcode`\^^I=\active6679\def^^I{\leavevmode\egroup6680\dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab6681\divide\dimen\verbbox by\tabw6682\multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw6683\advance\dimen\verbbox by\tabw % advance to next multiple of \tabw6684\wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox6685}%6686}6687\endgroup66886689% start the verbatim environment.6690\def\setupverbatim{%6691\let\nonarrowing = t%6692\nonfillstart6693\tt % easiest (and conventionally used) font for verbatim6694% The \leavevmode here is for blank lines. Otherwise, we would6695% never \starttabox and the \egroup would end verbatim mode.6696\def\par{\leavevmode\egroup\box\verbbox\endgraf}%6697\tabexpand6698\setupmarkupstyle{verbatim}%6699% Respect line breaks,6700% print special symbols as themselves, and6701% make each space count.6702% Must do in this order:6703\obeylines \uncatcodespecials \sepspaces6704\everypar{\starttabbox}%6705}67066707% Do the @verb magic: verbatim text is quoted by unique6708% delimiter characters. Before first delimiter expect a6709% right brace, after last delimiter expect closing brace:6710%6711% \def\doverb'{'<char>#1<char>'}'{#1}6712%6713% [Knuth] p. 382; only eat outer {}6714\begingroup6715\catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other6716\gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]6717\endgroup6718%6719\def\verb{\begingroup\setupverb\doverb}6720%6721%6722% Do the @verbatim magic: define the macro \doverbatim so that6723% the (first) argument ends when '@end verbatim' is reached, ie:6724%6725% \def\doverbatim#1@end verbatim{#1}6726%6727% For Texinfo it's a lot easier than for LaTeX,6728% because texinfo's \verbatim doesn't stop at '\end{verbatim}':6729% we need not redefine '\', '{' and '}'.6730%6731% Inspired by LaTeX's verbatim command set [latex.ltx]6732%6733\begingroup6734\catcode`\ =\active6735\obeylines %6736% ignore everything up to the first ^^M, that's the newline at the end6737% of the @verbatim input line itself. Otherwise we get an extra blank6738% line in the output.6739\xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%6740% We really want {...\end verbatim} in the body of the macro, but6741% without the active space; thus we have to use \xdef and \gobble.6742\endgroup6743%6744\envdef\verbatim{%6745\setupverbatim\doverbatim6746}6747\let\Everbatim = \afterenvbreak674867496750% @verbatiminclude FILE - insert text of file in verbatim environment.6751%6752\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}6753%6754\def\doverbatiminclude#1{%6755{%6756\makevalueexpandable6757\setupverbatim6758\indexnofonts % Allow `@@' and other weird things in file names.6759\wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%6760\input #16761\afterenvbreak6762}%6763}67646765% @copying ... @end copying.6766% Save the text away for @insertcopying later.6767%6768% We save the uninterpreted tokens, rather than creating a box.6769% Saving the text in a box would be much easier, but then all the6770% typesetting commands (@smallbook, font changes, etc.) have to be done6771% beforehand -- and a) we want @copying to be done first in the source6772% file; b) letting users define the frontmatter in as flexible order as6773% possible is very desirable.6774%6775\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}6776\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}6777%6778\def\insertcopying{%6779\begingroup6780\parindent = 0pt % paragraph indentation looks wrong on title page6781\scanexp\copyingtext6782\endgroup6783}678467856786\message{defuns,}6787% @defun etc.67886789\newskip\defbodyindent \defbodyindent=.4in6790\newskip\defargsindent \defargsindent=50pt6791\newskip\deflastargmargin \deflastargmargin=18pt6792\newcount\defunpenalty67936794% Start the processing of @deffn:6795\def\startdefun{%6796\ifnum\lastpenalty<100006797\medbreak6798\defunpenalty=10003 % Will keep this @deffn together with the6799% following @def command, see below.6800\else6801% If there are two @def commands in a row, we'll have a \nobreak,6802% which is there to keep the function description together with its6803% header. But if there's nothing but headers, we need to allow a6804% break somewhere. Check specifically for penalty 10002, inserted6805% by \printdefunline, instead of 10000, since the sectioning6806% commands also insert a nobreak penalty, and we don't want to allow6807% a break between a section heading and a defun.6808%6809% As a further refinement, we avoid "club" headers by signalling6810% with penalty of 10003 after the very first @deffn in the6811% sequence (see above), and penalty of 10002 after any following6812% @def command.6813\ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi6814%6815% Similarly, after a section heading, do not allow a break.6816% But do insert the glue.6817\medskip % preceded by discardable penalty, so not a breakpoint6818\fi6819%6820\parindent=0in6821\advance\leftskip by \defbodyindent6822\exdentamount=\defbodyindent6823}68246825\def\dodefunx#1{%6826% First, check whether we are in the right environment:6827\checkenv#1%6828%6829% As above, allow line break if we have multiple x headers in a row.6830% It's not a great place, though.6831\ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi6832%6833% And now, it's time to reuse the body of the original defun:6834\expandafter\gobbledefun#1%6835}6836\def\gobbledefun#1\startdefun{}68376838% \printdefunline \deffnheader{text}6839%6840\def\printdefunline#1#2{%6841\begingroup6842% call \deffnheader:6843#1#2 \endheader6844% common ending:6845\interlinepenalty = 100006846\advance\rightskip by 0pt plus 1fil\relax6847\endgraf6848\nobreak\vskip -\parskip6849\penalty\defunpenalty % signal to \startdefun and \dodefunx6850% Some of the @defun-type tags do not enable magic parentheses,6851% rendering the following check redundant. But we don't optimize.6852\checkparencounts6853\endgroup6854}68556856\def\Edefun{\endgraf\medbreak}68576858% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;6859% the only thing remaining is to define \deffnheader.6860%6861\def\makedefun#1{%6862\expandafter\let\csname E#1\endcsname = \Edefun6863\edef\temp{\noexpand\domakedefun6864\makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%6865\temp6866}68676868% \domakedefun \deffn \deffnx \deffnheader6869%6870% Define \deffn and \deffnx, without parameters.6871% \deffnheader has to be defined explicitly.6872%6873\def\domakedefun#1#2#3{%6874\envdef#1{%6875\startdefun6876\doingtypefnfalse % distinguish typed functions from all else6877\parseargusing\activeparens{\printdefunline#3}%6878}%6879\def#2{\dodefunx#1}%6880\def#3%6881}68826883\newif\ifdoingtypefn % doing typed function?6884\newif\ifrettypeownline % typeset return type on its own line?68856886% @deftypefnnewline on|off says whether the return type of typed functions6887% are printed on their own line. This affects @deftypefn, @deftypefun,6888% @deftypeop, and @deftypemethod.6889%6890\parseargdef\deftypefnnewline{%6891\def\temp{#1}%6892\ifx\temp\onword6893\expandafter\let\csname SETtxideftypefnnl\endcsname6894= \empty6895\else\ifx\temp\offword6896\expandafter\let\csname SETtxideftypefnnl\endcsname6897= \relax6898\else6899\errhelp = \EMsimple6900\errmessage{Unknown @txideftypefnnl value `\temp',6901must be on|off}%6902\fi\fi6903}69046905% Untyped functions:69066907% @deffn category name args6908\makedefun{deffn}{\deffngeneral{}}69096910% @deffn category class name args6911\makedefun{defop}#1 {\defopon{#1\ \putwordon}}69126913% \defopon {category on}class name args6914\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }69156916% \deffngeneral {subind}category name args6917%6918\def\deffngeneral#1#2 #3 #4\endheader{%6919% Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.6920\dosubind{fn}{\code{#3}}{#1}%6921\defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%6922}69236924% Typed functions:69256926% @deftypefn category type name args6927\makedefun{deftypefn}{\deftypefngeneral{}}69286929% @deftypeop category class type name args6930\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}69316932% \deftypeopon {category on}class type name args6933\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }69346935% \deftypefngeneral {subind}category type name args6936%6937\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%6938\dosubind{fn}{\code{#4}}{#1}%6939\doingtypefntrue6940\defname{#2}{#3}{#4}\defunargs{#5\unskip}%6941}69426943% Typed variables:69446945% @deftypevr category type var args6946\makedefun{deftypevr}{\deftypecvgeneral{}}69476948% @deftypecv category class type var args6949\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}69506951% \deftypecvof {category of}class type var args6952\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }69536954% \deftypecvgeneral {subind}category type var args6955%6956\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%6957\dosubind{vr}{\code{#4}}{#1}%6958\defname{#2}{#3}{#4}\defunargs{#5\unskip}%6959}69606961% Untyped variables:69626963% @defvr category var args6964\makedefun{defvr}#1 {\deftypevrheader{#1} {} }69656966% @defcv category class var args6967\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}69686969% \defcvof {category of}class var args6970\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }69716972% Types:69736974% @deftp category name args6975\makedefun{deftp}#1 #2 #3\endheader{%6976\doind{tp}{\code{#2}}%6977\defname{#1}{}{#2}\defunargs{#3\unskip}%6978}69796980% Remaining @defun-like shortcuts:6981\makedefun{defun}{\deffnheader{\putwordDeffunc} }6982\makedefun{defmac}{\deffnheader{\putwordDefmac} }6983\makedefun{defspec}{\deffnheader{\putwordDefspec} }6984\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }6985\makedefun{defvar}{\defvrheader{\putwordDefvar} }6986\makedefun{defopt}{\defvrheader{\putwordDefopt} }6987\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }6988\makedefun{defmethod}{\defopon\putwordMethodon}6989\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}6990\makedefun{defivar}{\defcvof\putwordInstanceVariableof}6991\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}69926993% \defname, which formats the name of the @def (not the args).6994% #1 is the category, such as "Function".6995% #2 is the return type, if any.6996% #3 is the function name.6997%6998% We are followed by (but not passed) the arguments, if any.6999%7000\def\defname#1#2#3{%7001\par7002% Get the values of \leftskip and \rightskip as they were outside the @def...7003\advance\leftskip by -\defbodyindent7004%7005% Determine if we are typesetting the return type of a typed function7006% on a line by itself.7007\rettypeownlinefalse7008\ifdoingtypefn % doing a typed function specifically?7009% then check user option for putting return type on its own line:7010\expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else7011\rettypeownlinetrue7012\fi7013\fi7014%7015% How we'll format the category name. Putting it in brackets helps7016% distinguish it from the body text that may end up on the next line7017% just below it.7018\def\temp{#1}%7019\setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}7020%7021% Figure out line sizes for the paragraph shape. We'll always have at7022% least two.7023\tempnum = 27024%7025% The first line needs space for \box0; but if \rightskip is nonzero,7026% we need only space for the part of \box0 which exceeds it:7027\dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip7028%7029% If doing a return type on its own line, we'll have another line.7030\ifrettypeownline7031\advance\tempnum by 17032\def\maybeshapeline{0in \hsize}%7033\else7034\def\maybeshapeline{}%7035\fi7036%7037% The continuations:7038\dimen2=\hsize \advance\dimen2 by -\defargsindent7039%7040% The final paragraph shape:7041\parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen27042%7043% Put the category name at the right margin.7044\noindent7045\hbox to 0pt{%7046\hfil\box0 \kern-\hsize7047% \hsize has to be shortened this way:7048\kern\leftskip7049% Intentionally do not respect \rightskip, since we need the space.7050}%7051%7052% Allow all lines to be underfull without complaint:7053\tolerance=10000 \hbadness=100007054\exdentamount=\defbodyindent7055{%7056% defun fonts. We use typewriter by default (used to be bold) because:7057% . we're printing identifiers, they should be in tt in principle.7058% . in languages with many accents, such as Czech or French, it's7059% common to leave accents off identifiers. The result looks ok in7060% tt, but exceedingly strange in rm.7061% . we don't want -- and --- to be treated as ligatures.7062% . this still does not fix the ?` and !` ligatures, but so far no7063% one has made identifiers using them :).7064\df \tt7065\def\temp{#2}% text of the return type7066\ifx\temp\empty\else7067\tclose{\temp}% typeset the return type7068\ifrettypeownline7069% put return type on its own line; prohibit line break following:7070\hfil\vadjust{\nobreak}\break7071\else7072\space % type on same line, so just followed by a space7073\fi7074\fi % no return type7075#3% output function name7076}%7077{\rm\enskip}% hskip 0.5 em of \tenrm7078%7079\boldbrax7080% arguments will be output next, if any.7081}70827083% Print arguments in slanted roman (not ttsl), inconsistently with using7084% tt for the name. This is because literal text is sometimes needed in7085% the argument list (groff manual), and ttsl and tt are not very7086% distinguishable. Prevent hyphenation at `-' chars.7087%7088\def\defunargs#1{%7089% use sl by default (not ttsl),7090% tt for the names.7091\df \sl \hyphenchar\font=07092%7093% On the other hand, if an argument has two dashes (for instance), we7094% want a way to get ttsl. We used to recommend @var for that, so7095% leave the code in, but it's strange for @var to lead to typewriter.7096% Nowadays we recommend @code, since the difference between a ttsl hyphen7097% and a tt hyphen is pretty tiny. @code also disables ?` !`.7098\def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%7099#1%7100\sl\hyphenchar\font=457101}71027103% We want ()&[] to print specially on the defun line.7104%7105\def\activeparens{%7106\catcode`\(=\active \catcode`\)=\active7107\catcode`\[=\active \catcode`\]=\active7108\catcode`\&=\active7109}71107111% Make control sequences which act like normal parenthesis chars.7112\let\lparen = ( \let\rparen = )71137114% Be sure that we always have a definition for `(', etc. For example,7115% if the fn name has parens in it, \boldbrax will not be in effect yet,7116% so TeX would otherwise complain about undefined control sequence.7117{7118\activeparens7119\global\let(=\lparen \global\let)=\rparen7120\global\let[=\lbrack \global\let]=\rbrack7121\global\let& = \&71227123\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}7124\gdef\magicamp{\let&=\amprm}7125}71267127\newcount\parencount71287129% If we encounter &foo, then turn on ()-hacking afterwards7130\newif\ifampseen7131\def\amprm#1 {\ampseentrue{\bf\ }}71327133\def\parenfont{%7134\ifampseen7135% At the first level, print parens in roman,7136% otherwise use the default font.7137\ifnum \parencount=1 \rm \fi7138\else7139% The \sf parens (in \boldbrax) actually are a little bolder than7140% the contained text. This is especially needed for [ and ] .7141\sf7142\fi7143}7144\def\infirstlevel#1{%7145\ifampseen7146\ifnum\parencount=17147#1%7148\fi7149\fi7150}7151\def\bfafterword#1 {#1 \bf}71527153\def\opnr{%7154\global\advance\parencount by 17155{\parenfont(}%7156\infirstlevel \bfafterword7157}7158\def\clnr{%7159{\parenfont)}%7160\infirstlevel \sl7161\global\advance\parencount by -17162}71637164\newcount\brackcount7165\def\lbrb{%7166\global\advance\brackcount by 17167{\bf[}%7168}7169\def\rbrb{%7170{\bf]}%7171\global\advance\brackcount by -17172}71737174\def\checkparencounts{%7175\ifnum\parencount=0 \else \badparencount \fi7176\ifnum\brackcount=0 \else \badbrackcount \fi7177}7178% these should not use \errmessage; the glibc manual, at least, actually7179% has such constructs (when documenting function pointers).7180\def\badparencount{%7181\message{Warning: unbalanced parentheses in @def...}%7182\global\parencount=07183}7184\def\badbrackcount{%7185\message{Warning: unbalanced square brackets in @def...}%7186\global\brackcount=07187}718871897190\message{macros,}7191% @macro.71927193% To do this right we need a feature of e-TeX, \scantokens,7194% which we arrange to emulate with a temporary file in ordinary TeX.7195\ifx\eTeXversion\thisisundefined7196\newwrite\macscribble7197\def\scantokens#1{%7198\toks0={#1}%7199\immediate\openout\macscribble=\jobname.tmp7200\immediate\write\macscribble{\the\toks0}%7201\immediate\closeout\macscribble7202\input \jobname.tmp7203}7204\fi72057206\def\scanmacro#1{\begingroup7207\newlinechar`\^^M7208\let\xeatspaces\eatspaces7209%7210% Undo catcode changes of \startcontents and \doprintindex7211% When called from @insertcopying or (short)caption, we need active7212% backslash to get it printed correctly. Previously, we had7213% \catcode`\\=\other instead. We'll see whether a problem appears7214% with macro expansion. --kasal, 19aug047215\catcode`\@=0 \catcode`\\=\active \escapechar=`\@7216%7217% ... and for \example:7218\spaceisspace7219%7220% The \empty here causes a following catcode 5 newline to be eaten as7221% part of reading whitespace after a control sequence. It does not7222% eat a catcode 13 newline. There's no good way to handle the two7223% cases (untried: maybe e-TeX's \everyeof could help, though plain TeX7224% would then have different behavior). See the Macro Details node in7225% the manual for the workaround we recommend for macros and7226% line-oriented commands.7227%7228\scantokens{#1\empty}%7229\endgroup}72307231\def\scanexp#1{%7232\edef\temp{\noexpand\scanmacro{#1}}%7233\temp7234}72357236\newcount\paramno % Count of parameters7237\newtoks\macname % Macro name7238\newif\ifrecursive % Is it recursive?72397240% List of all defined macros in the form7241% \definedummyword\macro1\definedummyword\macro2...7242% Currently is also contains all @aliases; the list can be split7243% if there is a need.7244\def\macrolist{}72457246% Add the macro to \macrolist7247\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}7248\def\addtomacrolistxxx#1{%7249\toks0 = \expandafter{\macrolist\definedummyword#1}%7250\xdef\macrolist{\the\toks0}%7251}72527253% Utility routines.7254% This does \let #1 = #2, with \csnames; that is,7255% \let \csname#1\endcsname = \csname#2\endcsname7256% (except of course we have to play expansion games).7257%7258\def\cslet#1#2{%7259\expandafter\let7260\csname#1\expandafter\endcsname7261\csname#2\endcsname7262}72637264% Trim leading and trailing spaces off a string.7265% Concepts from aro-bend problem 15 (see CTAN).7266{\catcode`\@=117267\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}7268\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}7269\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}7270\def\unbrace#1{#1}7271\unbrace{\gdef\trim@@@ #1 } #2@{#1}7272}72737274% Trim a single trailing ^^M off a string.7275{\catcode`\^^M=\other \catcode`\Q=3%7276\gdef\eatcr #1{\eatcra #1Q^^MQ}%7277\gdef\eatcra#1^^MQ{\eatcrb#1Q}%7278\gdef\eatcrb#1Q#2Q{#1}%7279}72807281% Macro bodies are absorbed as an argument in a context where7282% all characters are catcode 10, 11 or 12, except \ which is active7283% (as in normal texinfo). It is necessary to change the definition of \7284% to recognize macro arguments; this is the job of \mbodybackslash.7285%7286% Non-ASCII encodings make 8-bit characters active, so un-activate7287% them to avoid their expansion. Must do this non-globally, to7288% confine the change to the current group.7289%7290% It's necessary to have hard CRs when the macro is executed. This is7291% done by making ^^M (\endlinechar) catcode 12 when reading the macro7292% body, and then making it the \newlinechar in \scanmacro.7293%7294\def\scanctxt{% used as subroutine7295\catcode`\"=\other7296\catcode`\+=\other7297\catcode`\<=\other7298\catcode`\>=\other7299\catcode`\@=\other7300\catcode`\^=\other7301\catcode`\_=\other7302\catcode`\|=\other7303\catcode`\~=\other7304\ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi7305}73067307\def\scanargctxt{% used for copying and captions, not macros.7308\scanctxt7309\catcode`\\=\other7310\catcode`\^^M=\other7311}73127313\def\macrobodyctxt{% used for @macro definitions7314\scanctxt7315\catcode`\{=\other7316\catcode`\}=\other7317\catcode`\^^M=\other7318\usembodybackslash7319}73207321\def\macroargctxt{% used when scanning invocations7322\scanctxt7323\catcode`\\=07324}7325% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes"7326% for the single characters \ { }. Thus, we end up with the "commands"7327% that would be written @\ @{ @} in a Texinfo document.7328%7329% We already have @{ and @}. For @\, we define it here, and only for7330% this purpose, to produce a typewriter backslash (so, the @\ that we7331% define for @math can't be used with @macro calls):7332%7333\def\\{\normalbackslash}%7334%7335% We would like to do this for \, too, since that is what makeinfo does.7336% But it is not possible, because Texinfo already has a command @, for a7337% cedilla accent. Documents must use @comma{} instead.7338%7339% \anythingelse will almost certainly be an error of some kind.734073417342% \mbodybackslash is the definition of \ in @macro bodies.7343% It maps \foo\ => \csname macarg.foo\endcsname => #N7344% where N is the macro parameter number.7345% We define \csname macarg.\endcsname to be \realbackslash, so7346% \\ in macro replacement text gets you a backslash.7347%7348{\catcode`@=0 @catcode`@\=@active7349@gdef@usembodybackslash{@let\=@mbodybackslash}7350@gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}7351}7352\expandafter\def\csname macarg.\endcsname{\realbackslash}73537354\def\margbackslash#1{\char`\#1 }73557356\def\macro{\recursivefalse\parsearg\macroxxx}7357\def\rmacro{\recursivetrue\parsearg\macroxxx}73587359\def\macroxxx#1{%7360\getargs{#1}% now \macname is the macname and \argl the arglist7361\ifx\argl\empty % no arguments7362\paramno=0\relax7363\else7364\expandafter\parsemargdef \argl;%7365\if\paramno>256\relax7366\ifx\eTeXversion\thisisundefined7367\errhelp = \EMsimple7368\errmessage{You need eTeX to compile a file with macros with more than 256 arguments}7369\fi7370\fi7371\fi7372\if1\csname ismacro.\the\macname\endcsname7373\message{Warning: redefining \the\macname}%7374\else7375\expandafter\ifx\csname \the\macname\endcsname \relax7376\else \errmessage{Macro name \the\macname\space already defined}\fi7377\global\cslet{macsave.\the\macname}{\the\macname}%7378\global\expandafter\let\csname ismacro.\the\macname\endcsname=1%7379\addtomacrolist{\the\macname}%7380\fi7381\begingroup \macrobodyctxt7382\ifrecursive \expandafter\parsermacbody7383\else \expandafter\parsemacbody7384\fi}73857386\parseargdef\unmacro{%7387\if1\csname ismacro.#1\endcsname7388\global\cslet{#1}{macsave.#1}%7389\global\expandafter\let \csname ismacro.#1\endcsname=0%7390% Remove the macro name from \macrolist:7391\begingroup7392\expandafter\let\csname#1\endcsname \relax7393\let\definedummyword\unmacrodo7394\xdef\macrolist{\macrolist}%7395\endgroup7396\else7397\errmessage{Macro #1 not defined}%7398\fi7399}74007401% Called by \do from \dounmacro on each macro. The idea is to omit any7402% macro definitions that have been changed to \relax.7403%7404\def\unmacrodo#1{%7405\ifx #1\relax7406% remove this7407\else7408\noexpand\definedummyword \noexpand#1%7409\fi7410}74117412% This makes use of the obscure feature that if the last token of a7413% <parameter list> is #, then the preceding argument is delimited by7414% an opening brace, and that opening brace is not consumed.7415\def\getargs#1{\getargsxxx#1{}}7416\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}7417\def\getmacname#1 #2\relax{\macname={#1}}7418\def\getmacargs#1{\def\argl{#1}}74197420% For macro processing make @ a letter so that we can make Texinfo private macro names.7421\edef\texiatcatcode{\the\catcode`\@}7422\catcode `@=11\relax74237424% Parse the optional {params} list. Set up \paramno and \paramlist7425% so \defmacro knows what to do. Define \macarg.BLAH for each BLAH7426% in the params list to some hook where the argument si to be expanded. If7427% there are less than 10 arguments that hook is to be replaced by ##N where N7428% is the position in that list, that is to say the macro arguments are to be7429% defined `a la TeX in the macro body.7430%7431% That gets used by \mbodybackslash (above).7432%7433% We need to get `macro parameter char #' into several definitions.7434% The technique used is stolen from LaTeX: let \hash be something7435% unexpandable, insert that wherever you need a #, and then redefine7436% it to # just before using the token list produced.7437%7438% The same technique is used to protect \eatspaces till just before7439% the macro is used.7440%7441% If there are 10 or more arguments, a different technique is used, where the7442% hook remains in the body, and when macro is to be expanded the body is7443% processed again to replace the arguments.7444%7445% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the7446% argument N value and then \edef the body (nothing else will expand because of7447% the catcode regime underwhich the body was input).7448%7449% If you compile with TeX (not eTeX), and you have macros with 10 or more7450% arguments, you need that no macro has more than 256 arguments, otherwise an7451% error is produced.7452\def\parsemargdef#1;{%7453\paramno=0\def\paramlist{}%7454\let\hash\relax7455\let\xeatspaces\relax7456\parsemargdefxxx#1,;,%7457% In case that there are 10 or more arguments we parse again the arguments7458% list to set new definitions for the \macarg.BLAH macros corresponding to7459% each BLAH argument. It was anyhow needed to parse already once this list7460% in order to count the arguments, and as macros with at most 9 arguments7461% are by far more frequent than macro with 10 or more arguments, defining7462% twice the \macarg.BLAH macros does not cost too much processing power.7463\ifnum\paramno<10\relax\else7464\paramno0\relax7465\parsemmanyargdef@@#1,;,% 10 or more arguments7466\fi7467}7468\def\parsemargdefxxx#1,{%7469\if#1;\let\next=\relax7470\else \let\next=\parsemargdefxxx7471\advance\paramno by 17472\expandafter\edef\csname macarg.\eatspaces{#1}\endcsname7473{\xeatspaces{\hash\the\paramno}}%7474\edef\paramlist{\paramlist\hash\the\paramno,}%7475\fi\next}74767477\def\parsemmanyargdef@@#1,{%7478\if#1;\let\next=\relax7479\else7480\let\next=\parsemmanyargdef@@7481\edef\tempb{\eatspaces{#1}}%7482\expandafter\def\expandafter\tempa7483\expandafter{\csname macarg.\tempb\endcsname}%7484% Note that we need some extra \noexpand\noexpand, this is because we7485% don't want \the to be expanded in the \parsermacbody as it uses an7486% \xdef .7487\expandafter\edef\tempa7488{\noexpand\noexpand\noexpand\the\toks\the\paramno}%7489\advance\paramno by 1\relax7490\fi\next}74917492% These two commands read recursive and nonrecursive macro bodies.7493% (They're different since rec and nonrec macros end differently.)7494%74957496\catcode `\@\texiatcatcode7497\long\def\parsemacbody#1@end macro%7498{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%7499\long\def\parsermacbody#1@end rmacro%7500{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%7501\catcode `\@=11\relax75027503\let\endargs@\relax7504\let\nil@\relax7505\def\nilm@{\nil@}%7506\long\def\nillm@{\nil@}%75077508% This macro is expanded during the Texinfo macro expansion, not during its7509% definition. It gets all the arguments values and assigns them to macros7510% macarg.ARGNAME7511%7512% #1 is the macro name7513% #2 is the list of argument names7514% #3 is the list of argument values7515\def\getargvals@#1#2#3{%7516\def\macargdeflist@{}%7517\def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.7518\def\paramlist{#2,\nil@}%7519\def\macroname{#1}%7520\begingroup7521\macroargctxt7522\def\argvaluelist{#3,\nil@}%7523\def\@tempa{#3}%7524\ifx\@tempa\empty7525\setemptyargvalues@7526\else7527\getargvals@@7528\fi7529}75307531%7532\def\getargvals@@{%7533\ifx\paramlist\nilm@7534% Some sanity check needed here that \argvaluelist is also empty.7535\ifx\argvaluelist\nillm@7536\else7537\errhelp = \EMsimple7538\errmessage{Too many arguments in macro `\macroname'!}%7539\fi7540\let\next\macargexpandinbody@7541\else7542\ifx\argvaluelist\nillm@7543% No more arguments values passed to macro. Set remaining named-arg7544% macros to empty.7545\let\next\setemptyargvalues@7546\else7547% pop current arg name into \@tempb7548\def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%7549\expandafter\@tempa\expandafter{\paramlist}%7550% pop current argument value into \@tempc7551\def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%7552\expandafter\@tempa\expandafter{\argvaluelist}%7553% Here \@tempb is the current arg name and \@tempc is the current arg value.7554% First place the new argument macro definition into \@tempd7555\expandafter\macname\expandafter{\@tempc}%7556\expandafter\let\csname macarg.\@tempb\endcsname\relax7557\expandafter\def\expandafter\@tempe\expandafter{%7558\csname macarg.\@tempb\endcsname}%7559\edef\@tempd{\long\def\@tempe{\the\macname}}%7560\push@\@tempd\macargdeflist@7561\let\next\getargvals@@7562\fi7563\fi7564\next7565}75667567\def\push@#1#2{%7568\expandafter\expandafter\expandafter\def7569\expandafter\expandafter\expandafter#2%7570\expandafter\expandafter\expandafter{%7571\expandafter#1#2}%7572}75737574% Replace arguments by their values in the macro body, and place the result7575% in macro \@tempa7576\def\macvalstoargs@{%7577% To do this we use the property that token registers that are \the'ed7578% within an \edef expand only once. So we are going to place all argument7579% values into respective token registers.7580%7581% First we save the token context, and initialize argument numbering.7582\begingroup7583\paramno0\relax7584% Then, for each argument number #N, we place the corresponding argument7585% value into a new token list register \toks#N7586\expandafter\putargsintokens@\saveparamlist@,;,%7587% Then, we expand the body so that argument are replaced by their7588% values. The trick for values not to be expanded themselves is that they7589% are within tokens and that tokens expand only once in an \edef .7590\edef\@tempc{\csname mac.\macroname .body\endcsname}%7591% Now we restore the token stack pointer to free the token list registers7592% which we have used, but we make sure that expanded body is saved after7593% group.7594\expandafter7595\endgroup7596\expandafter\def\expandafter\@tempa\expandafter{\@tempc}%7597}75987599\def\macargexpandinbody@{%7600%% Define the named-macro outside of this group and then close this group.7601\expandafter7602\endgroup7603\macargdeflist@7604% First the replace in body the macro arguments by their values, the result7605% is in \@tempa .7606\macvalstoargs@7607% Then we point at the \norecurse or \gobble (for recursive) macro value7608% with \@tempb .7609\expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname7610% Depending on whether it is recursive or not, we need some tailing7611% \egroup .7612\ifx\@tempb\gobble7613\let\@tempc\relax7614\else7615\let\@tempc\egroup7616\fi7617% And now we do the real job:7618\edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%7619\@tempd7620}76217622\def\putargsintokens@#1,{%7623\if#1;\let\next\relax7624\else7625\let\next\putargsintokens@7626% First we allocate the new token list register, and give it a temporary7627% alias \@tempb .7628\toksdef\@tempb\the\paramno7629% Then we place the argument value into that token list register.7630\expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname7631\expandafter\@tempb\expandafter{\@tempa}%7632\advance\paramno by 1\relax7633\fi7634\next7635}76367637% Save the token stack pointer into macro #17638\def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}}7639% Restore the token stack pointer from number in macro #17640\def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax}7641% newtoks that can be used non \outer .7642\def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi}76437644% Tailing missing arguments are set to empty7645\def\setemptyargvalues@{%7646\ifx\paramlist\nilm@7647\let\next\macargexpandinbody@7648\else7649\expandafter\setemptyargvaluesparser@\paramlist\endargs@7650\let\next\setemptyargvalues@7651\fi7652\next7653}76547655\def\setemptyargvaluesparser@#1,#2\endargs@{%7656\expandafter\def\expandafter\@tempa\expandafter{%7657\expandafter\def\csname macarg.#1\endcsname{}}%7658\push@\@tempa\macargdeflist@7659\def\paramlist{#2}%7660}76617662% #1 is the element target macro7663% #2 is the list macro7664% #3,#4\endargs@ is the list value7665\def\pop@#1#2#3,#4\endargs@{%7666\def#1{#3}%7667\def#2{#4}%7668}7669\long\def\longpop@#1#2#3,#4\endargs@{%7670\long\def#1{#3}%7671\long\def#2{#4}%7672}76737674% This defines a Texinfo @macro. There are eight cases: recursive and7675% nonrecursive macros of zero, one, up to nine, and many arguments.7676% Much magic with \expandafter here.7677% \xdef is used so that macro definitions will survive the file7678% they're defined in; @include reads the file inside a group.7679%7680\def\defmacro{%7681\let\hash=##% convert placeholders to macro parameter chars7682\ifrecursive7683\ifcase\paramno7684% 07685\expandafter\xdef\csname\the\macname\endcsname{%7686\noexpand\scanmacro{\temp}}%7687\or % 17688\expandafter\xdef\csname\the\macname\endcsname{%7689\bgroup\noexpand\macroargctxt7690\noexpand\braceorline7691\expandafter\noexpand\csname\the\macname xxx\endcsname}%7692\expandafter\xdef\csname\the\macname xxx\endcsname##1{%7693\egroup\noexpand\scanmacro{\temp}}%7694\else7695\ifnum\paramno<10\relax % at most 97696\expandafter\xdef\csname\the\macname\endcsname{%7697\bgroup\noexpand\macroargctxt7698\noexpand\csname\the\macname xx\endcsname}%7699\expandafter\xdef\csname\the\macname xx\endcsname##1{%7700\expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%7701\expandafter\expandafter7702\expandafter\xdef7703\expandafter\expandafter7704\csname\the\macname xxx\endcsname7705\paramlist{\egroup\noexpand\scanmacro{\temp}}%7706\else % 10 or more7707\expandafter\xdef\csname\the\macname\endcsname{%7708\noexpand\getargvals@{\the\macname}{\argl}%7709}%7710\global\expandafter\let\csname mac.\the\macname .body\endcsname\temp7711\global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble7712\fi7713\fi7714\else7715\ifcase\paramno7716% 07717\expandafter\xdef\csname\the\macname\endcsname{%7718\noexpand\norecurse{\the\macname}%7719\noexpand\scanmacro{\temp}\egroup}%7720\or % 17721\expandafter\xdef\csname\the\macname\endcsname{%7722\bgroup\noexpand\macroargctxt7723\noexpand\braceorline7724\expandafter\noexpand\csname\the\macname xxx\endcsname}%7725\expandafter\xdef\csname\the\macname xxx\endcsname##1{%7726\egroup7727\noexpand\norecurse{\the\macname}%7728\noexpand\scanmacro{\temp}\egroup}%7729\else % at most 97730\ifnum\paramno<10\relax7731\expandafter\xdef\csname\the\macname\endcsname{%7732\bgroup\noexpand\macroargctxt7733\expandafter\noexpand\csname\the\macname xx\endcsname}%7734\expandafter\xdef\csname\the\macname xx\endcsname##1{%7735\expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%7736\expandafter\expandafter7737\expandafter\xdef7738\expandafter\expandafter7739\csname\the\macname xxx\endcsname7740\paramlist{%7741\egroup7742\noexpand\norecurse{\the\macname}%7743\noexpand\scanmacro{\temp}\egroup}%7744\else % 10 or more:7745\expandafter\xdef\csname\the\macname\endcsname{%7746\noexpand\getargvals@{\the\macname}{\argl}%7747}%7748\global\expandafter\let\csname mac.\the\macname .body\endcsname\temp7749\global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse7750\fi7751\fi7752\fi}77537754\catcode `\@\texiatcatcode\relax77557756\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}77577758% \braceorline decides whether the next nonwhitespace character is a7759% {. If so it reads up to the closing }, if not, it reads the whole7760% line. Whatever was read is then fed to the next control sequence7761% as an argument (by \parsebrace or \parsearg).7762%7763\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}7764\def\braceorlinexxx{%7765\ifx\nchar\bgroup\else7766\expandafter\parsearg7767\fi \macnamexxx}776877697770% @alias.7771% We need some trickery to remove the optional spaces around the equal7772% sign. Make them active and then expand them all to nothing.7773%7774\def\alias{\parseargusing\obeyspaces\aliasxxx}7775\def\aliasxxx #1{\aliasyyy#1\relax}7776\def\aliasyyy #1=#2\relax{%7777{%7778\expandafter\let\obeyedspace=\empty7779\addtomacrolist{#1}%7780\xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%7781}%7782\next7783}778477857786\message{cross references,}77877788\newwrite\auxfile7789\newif\ifhavexrefs % True if xref values are known.7790\newif\ifwarnedxrefs % True if we warned once that they aren't known.77917792% @inforef is relatively simple.7793\def\inforef #1{\inforefzzz #1,,,,**}7794\def\inforefzzz #1,#2,#3,#4**{%7795\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},7796node \samp{\ignorespaces#1{}}}77977798% @node's only job in TeX is to define \lastnode, which is used in7799% cross-references. The @node line might or might not have commas, and7800% might or might not have spaces before the first comma, like:7801% @node foo , bar , ...7802% We don't want such trailing spaces in the node name.7803%7804\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}7805%7806% also remove a trailing comma, in case of something like this:7807% @node Help-Cross, , , Cross-refs7808\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}7809\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}78107811\let\nwnode=\node7812\let\lastnode=\empty78137814% Write a cross-reference definition for the current node. #1 is the7815% type (Ynumbered, Yappendix, Ynothing).7816%7817\def\donoderef#1{%7818\ifx\lastnode\empty\else7819\setref{\lastnode}{#1}%7820\global\let\lastnode=\empty7821\fi7822}78237824% @anchor{NAME} -- define xref target at arbitrary point.7825%7826\newcount\savesfregister7827%7828\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}7829\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}7830\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}78317832% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an7833% anchor), which consists of three parts:7834% 1) NAME-title - the current sectioning name taken from \lastsection,7835% or the anchor name.7836% 2) NAME-snt - section number and type, passed as the SNT arg, or7837% empty for anchors.7838% 3) NAME-pg - the page number.7839%7840% This is called from \donoderef, \anchor, and \dofloat. In the case of7841% floats, there is an additional part, which is not written here:7842% 4) NAME-lof - the text as it should appear in a @listoffloats.7843%7844\def\setref#1#2{%7845\pdfmkdest{#1}%7846\iflinks7847{%7848\atdummies % preserve commands, but don't expand them7849\edef\writexrdef##1##2{%7850\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef7851##1}{##2}}% these are parameters of \writexrdef7852}%7853\toks0 = \expandafter{\lastsection}%7854\immediate \writexrdef{title}{\the\toks0 }%7855\immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.7856\safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout7857}%7858\fi7859}78607861% @xrefautosectiontitle on|off says whether @section(ing) names are used7862% automatically in xrefs, if the third arg is not explicitly specified.7863% This was provided as a "secret" @set xref-automatic-section-title7864% variable, now it's official.7865%7866\parseargdef\xrefautomaticsectiontitle{%7867\def\temp{#1}%7868\ifx\temp\onword7869\expandafter\let\csname SETxref-automatic-section-title\endcsname7870= \empty7871\else\ifx\temp\offword7872\expandafter\let\csname SETxref-automatic-section-title\endcsname7873= \relax7874\else7875\errhelp = \EMsimple7876\errmessage{Unknown @xrefautomaticsectiontitle value `\temp',7877must be on|off}%7878\fi\fi7879}78807881%7882% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is7883% the node name, #2 the name of the Info cross-reference, #3 the printed7884% node name, #4 the name of the Info file, #5 the name of the printed7885% manual. All but the node name can be omitted.7886%7887\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}7888\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}7889\def\ref#1{\xrefX[#1,,,,,,,]}7890%7891\newbox\toprefbox7892\newbox\printedrefnamebox7893\newbox\infofilenamebox7894\newbox\printedmanualbox7895%7896\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup7897\unsepspaces7898%7899% Get args without leading/trailing spaces.7900\def\printedrefname{\ignorespaces #3}%7901\setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%7902%7903\def\infofilename{\ignorespaces #4}%7904\setbox\infofilenamebox = \hbox{\infofilename\unskip}%7905%7906\def\printedmanual{\ignorespaces #5}%7907\setbox\printedmanualbox = \hbox{\printedmanual\unskip}%7908%7909% If the printed reference name (arg #3) was not explicitly given in7910% the @xref, figure out what we want to use.7911\ifdim \wd\printedrefnamebox = 0pt7912% No printed node name was explicitly given.7913\expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax7914% Not auto section-title: use node name inside the square brackets.7915\def\printedrefname{\ignorespaces #1}%7916\else7917% Auto section-title: use chapter/section title inside7918% the square brackets if we have it.7919\ifdim \wd\printedmanualbox > 0pt7920% It is in another manual, so we don't have it; use node name.7921\def\printedrefname{\ignorespaces #1}%7922\else7923\ifhavexrefs7924% We (should) know the real title if we have the xref values.7925\def\printedrefname{\refx{#1-title}{}}%7926\else7927% Otherwise just copy the Info node name.7928\def\printedrefname{\ignorespaces #1}%7929\fi%7930\fi7931\fi7932\fi7933%7934% Make link in pdf output.7935\ifpdf7936{\indexnofonts7937\turnoffactive7938\makevalueexpandable7939% This expands tokens, so do it after making catcode changes, so _7940% etc. don't get their TeX definitions. This ignores all spaces in7941% #4, including (wrongly) those in the middle of the filename.7942\getfilename{#4}%7943%7944% This (wrongly) does not take account of leading or trailing7945% spaces in #1, which should be ignored.7946\edef\pdfxrefdest{#1}%7947\ifx\pdfxrefdest\empty7948\def\pdfxrefdest{Top}% no empty targets7949\else7950\txiescapepdf\pdfxrefdest % escape PDF special chars7951\fi7952%7953\leavevmode7954\startlink attr{/Border [0 0 0]}%7955\ifnum\filenamelength>07956goto file{\the\filename.pdf} name{\pdfxrefdest}%7957\else7958goto name{\pdfmkpgn{\pdfxrefdest}}%7959\fi7960}%7961\setcolor{\linkcolor}%7962\fi7963%7964% Float references are printed completely differently: "Figure 1.2"7965% instead of "[somenode], p.3". We distinguish them by the7966% LABEL-title being set to a magic string.7967{%7968% Have to otherify everything special to allow the \csname to7969% include an _ in the xref name, etc.7970\indexnofonts7971\turnoffactive7972\expandafter\global\expandafter\let\expandafter\Xthisreftitle7973\csname XR#1-title\endcsname7974}%7975\iffloat\Xthisreftitle7976% If the user specified the print name (third arg) to the ref,7977% print it instead of our usual "Figure 1.2".7978\ifdim\wd\printedrefnamebox = 0pt7979\refx{#1-snt}{}%7980\else7981\printedrefname7982\fi7983%7984% If the user also gave the printed manual name (fifth arg), append7985% "in MANUALNAME".7986\ifdim \wd\printedmanualbox > 0pt7987\space \putwordin{} \cite{\printedmanual}%7988\fi7989\else7990% node/anchor (non-float) references.7991%7992% If we use \unhbox to print the node names, TeX does not insert7993% empty discretionaries after hyphens, which means that it will not7994% find a line break at a hyphen in a node names. Since some manuals7995% are best written with fairly long node names, containing hyphens,7996% this is a loss. Therefore, we give the text of the node name7997% again, so it is as if TeX is seeing it for the first time.7998%7999\ifdim \wd\printedmanualbox > 0pt8000% Cross-manual reference with a printed manual name.8001%8002\crossmanualxref{\cite{\printedmanual\unskip}}%8003%8004\else\ifdim \wd\infofilenamebox > 0pt8005% Cross-manual reference with only an info filename (arg 4), no8006% printed manual name (arg 5). This is essentially the same as8007% the case above; we output the filename, since we have nothing else.8008%8009\crossmanualxref{\code{\infofilename\unskip}}%8010%8011\else8012% Reference within this manual.8013%8014% _ (for example) has to be the character _ for the purposes of the8015% control sequence corresponding to the node, but it has to expand8016% into the usual \leavevmode...\vrule stuff for purposes of8017% printing. So we \turnoffactive for the \refx-snt, back on for the8018% printing, back off for the \refx-pg.8019{\turnoffactive8020% Only output a following space if the -snt ref is nonempty; for8021% @unnumbered and @anchor, it won't be.8022\setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%8023\ifdim \wd2 > 0pt \refx{#1-snt}\space\fi8024}%8025% output the `[mynode]' via the macro below so it can be overridden.8026\xrefprintnodename\printedrefname8027%8028% But we always want a comma and a space:8029,\space8030%8031% output the `page 3'.8032\turnoffactive \putwordpage\tie\refx{#1-pg}{}%8033\fi\fi8034\fi8035\endlink8036\endgroup}80378038% Output a cross-manual xref to #1. Used just above (twice).8039%8040% Only include the text "Section ``foo'' in" if the foo is neither8041% missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply8042% "see The Foo Manual", the idea being to refer to the whole manual.8043%8044% But, this being TeX, we can't easily compare our node name against the8045% string "Top" while ignoring the possible spaces before and after in8046% the input. By adding the arbitrary 7sp below, we make it much less8047% likely that a real node name would have the same width as "Top" (e.g.,8048% in a monospaced font). Hopefully it will never happen in practice.8049%8050% For the same basic reason, we retypeset the "Top" at every8051% reference, since the current font is indeterminate.8052%8053\def\crossmanualxref#1{%8054\setbox\toprefbox = \hbox{Top\kern7sp}%8055\setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%8056\ifdim \wd2 > 7sp % nonempty?8057\ifdim \wd2 = \wd\toprefbox \else % same as Top?8058\putwordSection{} ``\printedrefname'' \putwordin{}\space8059\fi8060\fi8061#1%8062}80638064% This macro is called from \xrefX for the `[nodename]' part of xref8065% output. It's a separate macro only so it can be changed more easily,8066% since square brackets don't work well in some documents. Particularly8067% one that Bob is working on :).8068%8069\def\xrefprintnodename#1{[#1]}80708071% Things referred to by \setref.8072%8073\def\Ynothing{}8074\def\Yomitfromtoc{}8075\def\Ynumbered{%8076\ifnum\secno=08077\putwordChapter@tie \the\chapno8078\else \ifnum\subsecno=08079\putwordSection@tie \the\chapno.\the\secno8080\else \ifnum\subsubsecno=08081\putwordSection@tie \the\chapno.\the\secno.\the\subsecno8082\else8083\putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno8084\fi\fi\fi8085}8086\def\Yappendix{%8087\ifnum\secno=08088\putwordAppendix@tie @char\the\appendixno{}%8089\else \ifnum\subsecno=08090\putwordSection@tie @char\the\appendixno.\the\secno8091\else \ifnum\subsubsecno=08092\putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno8093\else8094\putwordSection@tie8095@char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno8096\fi\fi\fi8097}80988099% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.8100% If its value is nonempty, SUFFIX is output afterward.8101%8102\def\refx#1#2{%8103{%8104\indexnofonts8105\otherbackslash8106\expandafter\global\expandafter\let\expandafter\thisrefX8107\csname XR#1\endcsname8108}%8109\ifx\thisrefX\relax8110% If not defined, say something at least.8111\angleleft un\-de\-fined\angleright8112\iflinks8113\ifhavexrefs8114{\toks0 = {#1}% avoid expansion of possibly-complex value8115\message{\linenumber Undefined cross reference `\the\toks0'.}}%8116\else8117\ifwarnedxrefs\else8118\global\warnedxrefstrue8119\message{Cross reference values unknown; you must run TeX again.}%8120\fi8121\fi8122\fi8123\else8124% It's defined, so just use it.8125\thisrefX8126\fi8127#2% Output the suffix in any case.8128}81298130% This is the macro invoked by entries in the aux file. Usually it's8131% just a \def (we prepend XR to the control sequence name to avoid8132% collisions). But if this is a float type, we have more work to do.8133%8134\def\xrdef#1#2{%8135{% The node name might contain 8-bit characters, which in our current8136% implementation are changed to commands like @'e. Don't let these8137% mess up the control sequence name.8138\indexnofonts8139\turnoffactive8140\xdef\safexrefname{#1}%8141}%8142%8143\expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref8144%8145% Was that xref control sequence that we just defined for a float?8146\expandafter\iffloat\csname XR\safexrefname\endcsname8147% it was a float, and we have the (safe) float type in \iffloattype.8148\expandafter\let\expandafter\floatlist8149\csname floatlist\iffloattype\endcsname8150%8151% Is this the first time we've seen this float type?8152\expandafter\ifx\floatlist\relax8153\toks0 = {\do}% yes, so just \do8154\else8155% had it before, so preserve previous elements in list.8156\toks0 = \expandafter{\floatlist\do}%8157\fi8158%8159% Remember this xref in the control sequence \floatlistFLOATTYPE,8160% for later use in \listoffloats.8161\expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks08162{\safexrefname}}%8163\fi8164}81658166% Read the last existing aux file, if any. No error if none exists.8167%8168\def\tryauxfile{%8169\openin 1 \jobname.aux8170\ifeof 1 \else8171\readdatafile{aux}%8172\global\havexrefstrue8173\fi8174\closein 18175}81768177\def\setupdatafile{%8178\catcode`\^^@=\other8179\catcode`\^^A=\other8180\catcode`\^^B=\other8181\catcode`\^^C=\other8182\catcode`\^^D=\other8183\catcode`\^^E=\other8184\catcode`\^^F=\other8185\catcode`\^^G=\other8186\catcode`\^^H=\other8187\catcode`\^^K=\other8188\catcode`\^^L=\other8189\catcode`\^^N=\other8190\catcode`\^^P=\other8191\catcode`\^^Q=\other8192\catcode`\^^R=\other8193\catcode`\^^S=\other8194\catcode`\^^T=\other8195\catcode`\^^U=\other8196\catcode`\^^V=\other8197\catcode`\^^W=\other8198\catcode`\^^X=\other8199\catcode`\^^Z=\other8200\catcode`\^^[=\other8201\catcode`\^^\=\other8202\catcode`\^^]=\other8203\catcode`\^^^=\other8204\catcode`\^^_=\other8205% It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.8206% in xref tags, i.e., node names. But since ^^e4 notation isn't8207% supported in the main text, it doesn't seem desirable. Furthermore,8208% that is not enough: for node names that actually contain a ^8209% character, we would end up writing a line like this: 'xrdef {'hat8210% b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first8211% argument, and \hat is not an expandable control sequence. It could8212% all be worked out, but why? Either we support ^^ or we don't.8213%8214% The other change necessary for this was to define \auxhat:8215% \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter8216% and then to call \auxhat in \setq.8217%8218\catcode`\^=\other8219%8220% Special characters. Should be turned off anyway, but...8221\catcode`\~=\other8222\catcode`\[=\other8223\catcode`\]=\other8224\catcode`\"=\other8225\catcode`\_=\other8226\catcode`\|=\other8227\catcode`\<=\other8228\catcode`\>=\other8229\catcode`\$=\other8230\catcode`\#=\other8231\catcode`\&=\other8232\catcode`\%=\other8233\catcode`+=\other % avoid \+ for paranoia even though we've turned it off8234%8235% This is to support \ in node names and titles, since the \8236% characters end up in a \csname. It's easier than8237% leaving it active and making its active definition an actual \8238% character. What I don't understand is why it works in the *value*8239% of the xrdef. Seems like it should be a catcode12 \, and that8240% should not typeset properly. But it works, so I'm moving on for8241% now. --karl, 15jan04.8242\catcode`\\=\other8243%8244% Make the characters 128-255 be printing characters.8245{%8246\count1=1288247\def\loop{%8248\catcode\count1=\other8249\advance\count1 by 18250\ifnum \count1<256 \loop \fi8251}%8252}%8253%8254% @ is our escape character in .aux files, and we need braces.8255\catcode`\{=18256\catcode`\}=28257\catcode`\@=08258}82598260\def\readdatafile#1{%8261\begingroup8262\setupdatafile8263\input\jobname.#18264\endgroup}826582668267\message{insertions,}8268% including footnotes.82698270\newcount \footnoteno82718272% The trailing space in the following definition for supereject is8273% vital for proper filling; pages come out unaligned when you do a8274% pagealignmacro call if that space before the closing brace is8275% removed. (Generally, numeric constants should always be followed by a8276% space to prevent strange expansion errors.)8277\def\supereject{\par\penalty -20000\footnoteno =0 }82788279% @footnotestyle is meaningful for Info output only.8280\let\footnotestyle=\comment82818282{\catcode `\@=118283%8284% Auto-number footnotes. Otherwise like plain.8285\gdef\footnote{%8286\let\indent=\ptexindent8287\let\noindent=\ptexnoindent8288\global\advance\footnoteno by \@ne8289\edef\thisfootno{$^{\the\footnoteno}$}%8290%8291% In case the footnote comes at the end of a sentence, preserve the8292% extra spacing after we do the footnote number.8293\let\@sf\empty8294\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi8295%8296% Remove inadvertent blank space before typesetting the footnote number.8297\unskip8298\thisfootno\@sf8299\dofootnote8300}%83018302% Don't bother with the trickery in plain.tex to not require the8303% footnote text as a parameter. Our footnotes don't need to be so general.8304%8305% Oh yes, they do; otherwise, @ifset (and anything else that uses8306% \parseargline) fails inside footnotes because the tokens are fixed when8307% the footnote is read. --karl, 16nov96.8308%8309\gdef\dofootnote{%8310\insert\footins\bgroup8311% We want to typeset this text as a normal paragraph, even if the8312% footnote reference occurs in (for example) a display environment.8313% So reset some parameters.8314\hsize=\pagewidth8315\interlinepenalty\interfootnotelinepenalty8316\splittopskip\ht\strutbox % top baseline for broken footnotes8317\splitmaxdepth\dp\strutbox8318\floatingpenalty\@MM8319\leftskip\z@skip8320\rightskip\z@skip8321\spaceskip\z@skip8322\xspaceskip\z@skip8323\parindent\defaultparindent8324%8325\smallfonts \rm8326%8327% Because we use hanging indentation in footnotes, a @noindent appears8328% to exdent this text, so make it be a no-op. makeinfo does not use8329% hanging indentation so @noindent can still be needed within footnote8330% text after an @example or the like (not that this is good style).8331\let\noindent = \relax8332%8333% Hang the footnote text off the number. Use \everypar in case the8334% footnote extends for more than one paragraph.8335\everypar = {\hang}%8336\textindent{\thisfootno}%8337%8338% Don't crash into the line above the footnote text. Since this8339% expands into a box, it must come within the paragraph, lest it8340% provide a place where TeX can split the footnote.8341\footstrut8342%8343% Invoke rest of plain TeX footnote routine.8344\futurelet\next\fo@t8345}8346}%end \catcode `\@=1183478348% In case a @footnote appears in a vbox, save the footnote text and create8349% the real \insert just after the vbox finished. Otherwise, the insertion8350% would be lost.8351% Similarly, if a @footnote appears inside an alignment, save the footnote8352% text to a box and make the \insert when a row of the table is finished.8353% And the same can be done for other insert classes. --kasal, 16nov03.83548355% Replace the \insert primitive by a cheating macro.8356% Deeper inside, just make sure that the saved insertions are not spilled8357% out prematurely.8358%8359\def\startsavinginserts{%8360\ifx \insert\ptexinsert8361\let\insert\saveinsert8362\else8363\let\checkinserts\relax8364\fi8365}83668367% This \insert replacement works for both \insert\footins{foo} and8368% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.8369%8370\def\saveinsert#1{%8371\edef\next{\noexpand\savetobox \makeSAVEname#1}%8372\afterassignment\next8373% swallow the left brace8374\let\temp =8375}8376\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}8377\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}83788379\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}83808381\def\placesaveins#1{%8382\ptexinsert \csname\expandafter\gobblesave\string#1\endcsname8383{\box#1}%8384}83858386% eat @SAVE -- beware, all of them have catcode \other:8387{8388\def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)8389\gdef\gobblesave @SAVE{}8390}83918392% initialization:8393\def\newsaveins #1{%8394\edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%8395\next8396}8397\def\newsaveinsX #1{%8398\csname newbox\endcsname #1%8399\expandafter\def\expandafter\checkinserts\expandafter{\checkinserts8400\checksaveins #1}%8401}84028403% initialize:8404\let\checkinserts\empty8405\newsaveins\footins8406\newsaveins\margin840784088409% @image. We use the macros from epsf.tex to support this.8410% If epsf.tex is not installed and @image is used, we complain.8411%8412% Check for and read epsf.tex up front. If we read it only at @image8413% time, we might be inside a group, and then its definitions would get8414% undone and the next image would fail.8415\openin 1 = epsf.tex8416\ifeof 1 \else8417% Do not bother showing banner with epsf.tex v2.7k (available in8418% doc/epsf.tex and on ctan).8419\def\epsfannounce{\toks0 = }%8420\input epsf.tex8421\fi8422\closein 18423%8424% We will only complain once about lack of epsf.tex.8425\newif\ifwarnednoepsf8426\newhelp\noepsfhelp{epsf.tex must be installed for images to8427work. It is also included in the Texinfo distribution, or you can get8428it from ftp://tug.org/tex/epsf.tex.}8429%8430\def\image#1{%8431\ifx\epsfbox\thisisundefined8432\ifwarnednoepsf \else8433\errhelp = \noepsfhelp8434\errmessage{epsf.tex not found, images will be ignored}%8435\global\warnednoepsftrue8436\fi8437\else8438\imagexxx #1,,,,,\finish8439\fi8440}8441%8442% Arguments to @image:8443% #1 is (mandatory) image filename; we tack on .eps extension.8444% #2 is (optional) width, #3 is (optional) height.8445% #4 is (ignored optional) html alt text.8446% #5 is (ignored optional) extension.8447% #6 is just the usual extra ignored arg for parsing stuff.8448\newif\ifimagevmode8449\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup8450\catcode`\^^M = 5 % in case we're inside an example8451\normalturnoffactive % allow _ et al. in names8452% If the image is by itself, center it.8453\ifvmode8454\imagevmodetrue8455\else \ifx\centersub\centerV8456% for @center @image, we need a vbox so we can have our vertical space8457\imagevmodetrue8458\vbox\bgroup % vbox has better behavior than vtop herev8459\fi\fi8460%8461\ifimagevmode8462\nobreak\medskip8463% Usually we'll have text after the image which will insert8464% \parskip glue, so insert it here too to equalize the space8465% above and below.8466\nobreak\vskip\parskip8467\nobreak8468\fi8469%8470% Leave vertical mode so that indentation from an enclosing8471% environment such as @quotation is respected.8472% However, if we're at the top level, we don't want the8473% normal paragraph indentation.8474% On the other hand, if we are in the case of @center @image, we don't8475% want to start a paragraph, which will create a hsize-width box and8476% eradicate the centering.8477\ifx\centersub\centerV\else \noindent \fi8478%8479% Output the image.8480\ifpdf8481\dopdfimage{#1}{#2}{#3}%8482\else8483% \epsfbox itself resets \epsf?size at each figure.8484\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi8485\setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi8486\epsfbox{#1.eps}%8487\fi8488%8489\ifimagevmode8490\medskip % space after a standalone image8491\fi8492\ifx\centersub\centerV \egroup \fi8493\endgroup}849484958496% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,8497% etc. We don't actually implement floating yet, we always include the8498% float "here". But it seemed the best name for the future.8499%8500\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}85018502% There may be a space before second and/or third parameter; delete it.8503\def\eatcommaspace#1, {#1,}85048505% #1 is the optional FLOATTYPE, the text label for this float, typically8506% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,8507% this float will not be numbered and cannot be referred to.8508%8509% #2 is the optional xref label. Also must be present for the float to8510% be referable.8511%8512% #3 is the optional positioning argument; for now, it is ignored. It8513% will somehow specify the positions allowed to float to (here, top, bottom).8514%8515% We keep a separate counter for each FLOATTYPE, which we reset at each8516% chapter-level command.8517\let\resetallfloatnos=\empty8518%8519\def\dofloat#1,#2,#3,#4\finish{%8520\let\thiscaption=\empty8521\let\thisshortcaption=\empty8522%8523% don't lose footnotes inside @float.8524%8525% BEWARE: when the floats start float, we have to issue warning whenever an8526% insert appears inside a float which could possibly float. --kasal, 26may048527%8528\startsavinginserts8529%8530% We can't be used inside a paragraph.8531\par8532%8533\vtop\bgroup8534\def\floattype{#1}%8535\def\floatlabel{#2}%8536\def\floatloc{#3}% we do nothing with this yet.8537%8538\ifx\floattype\empty8539\let\safefloattype=\empty8540\else8541{%8542% the floattype might have accents or other special characters,8543% but we need to use it in a control sequence name.8544\indexnofonts8545\turnoffactive8546\xdef\safefloattype{\floattype}%8547}%8548\fi8549%8550% If label is given but no type, we handle that as the empty type.8551\ifx\floatlabel\empty \else8552% We want each FLOATTYPE to be numbered separately (Figure 1,8553% Table 1, Figure 2, ...). (And if no label, no number.)8554%8555\expandafter\getfloatno\csname\safefloattype floatno\endcsname8556\global\advance\floatno by 18557%8558{%8559% This magic value for \lastsection is output by \setref as the8560% XREFLABEL-title value. \xrefX uses it to distinguish float8561% labels (which have a completely different output format) from8562% node and anchor labels. And \xrdef uses it to construct the8563% lists of floats.8564%8565\edef\lastsection{\floatmagic=\safefloattype}%8566\setref{\floatlabel}{Yfloat}%8567}%8568\fi8569%8570% start with \parskip glue, I guess.8571\vskip\parskip8572%8573% Don't suppress indentation if a float happens to start a section.8574\restorefirstparagraphindent8575}85768577% we have these possibilities:8578% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap8579% @float Foo,lbl & no caption: Foo 1.18580% @float Foo & @caption{Cap}: Foo: Cap8581% @float Foo & no caption: Foo8582% @float ,lbl & Caption{Cap}: 1.1: Cap8583% @float ,lbl & no caption: 1.18584% @float & @caption{Cap}: Cap8585% @float & no caption:8586%8587\def\Efloat{%8588\let\floatident = \empty8589%8590% In all cases, if we have a float type, it comes first.8591\ifx\floattype\empty \else \def\floatident{\floattype}\fi8592%8593% If we have an xref label, the number comes next.8594\ifx\floatlabel\empty \else8595\ifx\floattype\empty \else % if also had float type, need tie first.8596\appendtomacro\floatident{\tie}%8597\fi8598% the number.8599\appendtomacro\floatident{\chaplevelprefix\the\floatno}%8600\fi8601%8602% Start the printed caption with what we've constructed in8603% \floatident, but keep it separate; we need \floatident again.8604\let\captionline = \floatident8605%8606\ifx\thiscaption\empty \else8607\ifx\floatident\empty \else8608\appendtomacro\captionline{: }% had ident, so need a colon between8609\fi8610%8611% caption text.8612\appendtomacro\captionline{\scanexp\thiscaption}%8613\fi8614%8615% If we have anything to print, print it, with space before.8616% Eventually this needs to become an \insert.8617\ifx\captionline\empty \else8618\vskip.5\parskip8619\captionline8620%8621% Space below caption.8622\vskip\parskip8623\fi8624%8625% If have an xref label, write the list of floats info. Do this8626% after the caption, to avoid chance of it being a breakpoint.8627\ifx\floatlabel\empty \else8628% Write the text that goes in the lof to the aux file as8629% \floatlabel-lof. Besides \floatident, we include the short8630% caption if specified, else the full caption if specified, else nothing.8631{%8632\atdummies8633%8634% since we read the caption text in the macro world, where ^^M8635% is turned into a normal character, we have to scan it back, so8636% we don't write the literal three characters "^^M" into the aux file.8637\scanexp{%8638\xdef\noexpand\gtemp{%8639\ifx\thisshortcaption\empty8640\thiscaption8641\else8642\thisshortcaption8643\fi8644}%8645}%8646\immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident8647\ifx\gtemp\empty \else : \gtemp \fi}}%8648}%8649\fi8650\egroup % end of \vtop8651%8652% place the captured inserts8653%8654% BEWARE: when the floats start floating, we have to issue warning8655% whenever an insert appears inside a float which could possibly8656% float. --kasal, 26may048657%8658\checkinserts8659}86608661% Append the tokens #2 to the definition of macro #1, not expanding either.8662%8663\def\appendtomacro#1#2{%8664\expandafter\def\expandafter#1\expandafter{#1#2}%8665}86668667% @caption, @shortcaption8668%8669\def\caption{\docaption\thiscaption}8670\def\shortcaption{\docaption\thisshortcaption}8671\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}8672\def\defcaption#1#2{\egroup \def#1{#2}}86738674% The parameter is the control sequence identifying the counter we are8675% going to use. Create it if it doesn't exist and assign it to \floatno.8676\def\getfloatno#1{%8677\ifx#1\relax8678% Haven't seen this figure type before.8679\csname newcount\endcsname #1%8680%8681% Remember to reset this floatno at the next chap.8682\expandafter\gdef\expandafter\resetallfloatnos8683\expandafter{\resetallfloatnos #1=0 }%8684\fi8685\let\floatno#1%8686}86878688% \setref calls this to get the XREFLABEL-snt value. We want an @xref8689% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we8690% first read the @float command.8691%8692\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%86938694% Magic string used for the XREFLABEL-title value, so \xrefX can8695% distinguish floats from other xref types.8696\def\floatmagic{!!float!!}86978698% #1 is the control sequence we are passed; we expand into a conditional8699% which is true if #1 represents a float ref. That is, the magic8700% \lastsection value which we \setref above.8701%8702\def\iffloat#1{\expandafter\doiffloat#1==\finish}8703%8704% #1 is (maybe) the \floatmagic string. If so, #2 will be the8705% (safe) float type for this float. We set \iffloattype to #2.8706%8707\def\doiffloat#1=#2=#3\finish{%8708\def\temp{#1}%8709\def\iffloattype{#2}%8710\ifx\temp\floatmagic8711}87128713% @listoffloats FLOATTYPE - print a list of floats like a table of contents.8714%8715\parseargdef\listoffloats{%8716\def\floattype{#1}% floattype8717{%8718% the floattype might have accents or other special characters,8719% but we need to use it in a control sequence name.8720\indexnofonts8721\turnoffactive8722\xdef\safefloattype{\floattype}%8723}%8724%8725% \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.8726\expandafter\ifx\csname floatlist\safefloattype\endcsname \relax8727\ifhavexrefs8728% if the user said @listoffloats foo but never @float foo.8729\message{\linenumber No `\safefloattype' floats to list.}%8730\fi8731\else8732\begingroup8733\leftskip=\tocindent % indent these entries like a toc8734\let\do=\listoffloatsdo8735\csname floatlist\safefloattype\endcsname8736\endgroup8737\fi8738}87398740% This is called on each entry in a list of floats. We're passed the8741% xref label, in the form LABEL-title, which is how we save it in the8742% aux file. We strip off the -title and look up \XRLABEL-lof, which8743% has the text we're supposed to typeset here.8744%8745% Figures without xref labels will not be included in the list (since8746% they won't appear in the aux file).8747%8748\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}8749\def\listoffloatsdoentry#1-title\finish{{%8750% Can't fully expand XR#1-lof because it can contain anything. Just8751% pass the control sequence. On the other hand, XR#1-pg is just the8752% page number, and we want to fully expand that so we can get a link8753% in pdf output.8754\toksA = \expandafter{\csname XR#1-lof\endcsname}%8755%8756% use the same \entry macro we use to generate the TOC and index.8757\edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%8758\writeentry8759}}876087618762\message{localization,}87638764% For single-language documents, @documentlanguage is usually given very8765% early, just after @documentencoding. Single argument is the language8766% (de) or locale (de_DE) abbreviation.8767%8768{8769\catcode`\_ = \active8770\globaldefs=18771\parseargdef\documentlanguage{\begingroup8772\let_=\normalunderscore % normal _ character for filenames8773\tex % read txi-??.tex file in plain TeX.8774% Read the file by the name they passed if it exists.8775\openin 1 txi-#1.tex8776\ifeof 18777\documentlanguagetrywithoutunderscore{#1_\finish}%8778\else8779\globaldefs = 1 % everything in the txi-LL files needs to persist8780\input txi-#1.tex8781\fi8782\closein 18783\endgroup % end raw TeX8784\endgroup}8785%8786% If they passed de_DE, and txi-de_DE.tex doesn't exist,8787% try txi-de.tex.8788%8789\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%8790\openin 1 txi-#1.tex8791\ifeof 18792\errhelp = \nolanghelp8793\errmessage{Cannot read language file txi-#1.tex}%8794\else8795\globaldefs = 1 % everything in the txi-LL files needs to persist8796\input txi-#1.tex8797\fi8798\closein 18799}8800}% end of special _ catcode8801%8802\newhelp\nolanghelp{The given language definition file cannot be found or8803is empty. Maybe you need to install it? Putting it in the current8804directory should work if nowhere else does.}88058806% This macro is called from txi-??.tex files; the first argument is the8807% \language name to set (without the "\lang@" prefix), the second and8808% third args are \{left,right}hyphenmin.8809%8810% The language names to pass are determined when the format is built.8811% See the etex.log file created at that time, e.g.,8812% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.8813%8814% With TeX Live 2008, etex now includes hyphenation patterns for all8815% available languages. This means we can support hyphenation in8816% Texinfo, at least to some extent. (This still doesn't solve the8817% accented characters problem.)8818%8819\catcode`@=118820\def\txisetlanguage#1#2#3{%8821% do not set the language if the name is undefined in the current TeX.8822\expandafter\ifx\csname lang@#1\endcsname \relax8823\message{no patterns for #1}%8824\else8825\global\language = \csname lang@#1\endcsname8826\fi8827% but there is no harm in adjusting the hyphenmin values regardless.8828\global\lefthyphenmin = #2\relax8829\global\righthyphenmin = #3\relax8830}88318832% Helpers for encodings.8833% Set the catcode of characters 128 through 255 to the specified number.8834%8835\def\setnonasciicharscatcode#1{%8836\count255=1288837\loop\ifnum\count255<2568838\global\catcode\count255=#1\relax8839\advance\count255 by 18840\repeat8841}88428843\def\setnonasciicharscatcodenonglobal#1{%8844\count255=1288845\loop\ifnum\count255<2568846\catcode\count255=#1\relax8847\advance\count255 by 18848\repeat8849}88508851% @documentencoding sets the definition of non-ASCII characters8852% according to the specified encoding.8853%8854\parseargdef\documentencoding{%8855% Encoding being declared for the document.8856\def\declaredencoding{\csname #1.enc\endcsname}%8857%8858% Supported encodings: names converted to tokens in order to be able8859% to compare them with \ifx.8860\def\ascii{\csname US-ASCII.enc\endcsname}%8861\def\latnine{\csname ISO-8859-15.enc\endcsname}%8862\def\latone{\csname ISO-8859-1.enc\endcsname}%8863\def\lattwo{\csname ISO-8859-2.enc\endcsname}%8864\def\utfeight{\csname UTF-8.enc\endcsname}%8865%8866\ifx \declaredencoding \ascii8867\asciichardefs8868%8869\else \ifx \declaredencoding \lattwo8870\setnonasciicharscatcode\active8871\lattwochardefs8872%8873\else \ifx \declaredencoding \latone8874\setnonasciicharscatcode\active8875\latonechardefs8876%8877\else \ifx \declaredencoding \latnine8878\setnonasciicharscatcode\active8879\latninechardefs8880%8881\else \ifx \declaredencoding \utfeight8882\setnonasciicharscatcode\active8883\utfeightchardefs8884%8885\else8886\message{Unknown document encoding #1, ignoring.}%8887%8888\fi % utfeight8889\fi % latnine8890\fi % latone8891\fi % lattwo8892\fi % ascii8893}88948895% A message to be logged when using a character that isn't available8896% the default font encoding (OT1).8897%8898\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}88998900% Take account of \c (plain) vs. \, (Texinfo) difference.8901\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}89028903% First, make active non-ASCII characters in order for them to be8904% correctly categorized when TeX reads the replacement text of8905% macros containing the character definitions.8906\setnonasciicharscatcode\active8907%8908% Latin1 (ISO-8859-1) character definitions.8909\def\latonechardefs{%8910\gdef^^a0{\tie}8911\gdef^^a1{\exclamdown}8912\gdef^^a2{\missingcharmsg{CENT SIGN}}8913\gdef^^a3{{\pounds}}8914\gdef^^a4{\missingcharmsg{CURRENCY SIGN}}8915\gdef^^a5{\missingcharmsg{YEN SIGN}}8916\gdef^^a6{\missingcharmsg{BROKEN BAR}}8917\gdef^^a7{\S}8918\gdef^^a8{\"{}}8919\gdef^^a9{\copyright}8920\gdef^^aa{\ordf}8921\gdef^^ab{\guillemetleft}8922\gdef^^ac{$\lnot$}8923\gdef^^ad{\-}8924\gdef^^ae{\registeredsymbol}8925\gdef^^af{\={}}8926%8927\gdef^^b0{\textdegree}8928\gdef^^b1{$\pm$}8929\gdef^^b2{$^2$}8930\gdef^^b3{$^3$}8931\gdef^^b4{\'{}}8932\gdef^^b5{$\mu$}8933\gdef^^b6{\P}8934%8935\gdef^^b7{$^.$}8936\gdef^^b8{\cedilla\ }8937\gdef^^b9{$^1$}8938\gdef^^ba{\ordm}8939%8940\gdef^^bb{\guillemetright}8941\gdef^^bc{$1\over4$}8942\gdef^^bd{$1\over2$}8943\gdef^^be{$3\over4$}8944\gdef^^bf{\questiondown}8945%8946\gdef^^c0{\`A}8947\gdef^^c1{\'A}8948\gdef^^c2{\^A}8949\gdef^^c3{\~A}8950\gdef^^c4{\"A}8951\gdef^^c5{\ringaccent A}8952\gdef^^c6{\AE}8953\gdef^^c7{\cedilla C}8954\gdef^^c8{\`E}8955\gdef^^c9{\'E}8956\gdef^^ca{\^E}8957\gdef^^cb{\"E}8958\gdef^^cc{\`I}8959\gdef^^cd{\'I}8960\gdef^^ce{\^I}8961\gdef^^cf{\"I}8962%8963\gdef^^d0{\DH}8964\gdef^^d1{\~N}8965\gdef^^d2{\`O}8966\gdef^^d3{\'O}8967\gdef^^d4{\^O}8968\gdef^^d5{\~O}8969\gdef^^d6{\"O}8970\gdef^^d7{$\times$}8971\gdef^^d8{\O}8972\gdef^^d9{\`U}8973\gdef^^da{\'U}8974\gdef^^db{\^U}8975\gdef^^dc{\"U}8976\gdef^^dd{\'Y}8977\gdef^^de{\TH}8978\gdef^^df{\ss}8979%8980\gdef^^e0{\`a}8981\gdef^^e1{\'a}8982\gdef^^e2{\^a}8983\gdef^^e3{\~a}8984\gdef^^e4{\"a}8985\gdef^^e5{\ringaccent a}8986\gdef^^e6{\ae}8987\gdef^^e7{\cedilla c}8988\gdef^^e8{\`e}8989\gdef^^e9{\'e}8990\gdef^^ea{\^e}8991\gdef^^eb{\"e}8992\gdef^^ec{\`{\dotless i}}8993\gdef^^ed{\'{\dotless i}}8994\gdef^^ee{\^{\dotless i}}8995\gdef^^ef{\"{\dotless i}}8996%8997\gdef^^f0{\dh}8998\gdef^^f1{\~n}8999\gdef^^f2{\`o}9000\gdef^^f3{\'o}9001\gdef^^f4{\^o}9002\gdef^^f5{\~o}9003\gdef^^f6{\"o}9004\gdef^^f7{$\div$}9005\gdef^^f8{\o}9006\gdef^^f9{\`u}9007\gdef^^fa{\'u}9008\gdef^^fb{\^u}9009\gdef^^fc{\"u}9010\gdef^^fd{\'y}9011\gdef^^fe{\th}9012\gdef^^ff{\"y}9013}90149015% Latin9 (ISO-8859-15) encoding character definitions.9016\def\latninechardefs{%9017% Encoding is almost identical to Latin1.9018\latonechardefs9019%9020\gdef^^a4{\euro}9021\gdef^^a6{\v S}9022\gdef^^a8{\v s}9023\gdef^^b4{\v Z}9024\gdef^^b8{\v z}9025\gdef^^bc{\OE}9026\gdef^^bd{\oe}9027\gdef^^be{\"Y}9028}90299030% Latin2 (ISO-8859-2) character definitions.9031\def\lattwochardefs{%9032\gdef^^a0{\tie}9033\gdef^^a1{\ogonek{A}}9034\gdef^^a2{\u{}}9035\gdef^^a3{\L}9036\gdef^^a4{\missingcharmsg{CURRENCY SIGN}}9037\gdef^^a5{\v L}9038\gdef^^a6{\'S}9039\gdef^^a7{\S}9040\gdef^^a8{\"{}}9041\gdef^^a9{\v S}9042\gdef^^aa{\cedilla S}9043\gdef^^ab{\v T}9044\gdef^^ac{\'Z}9045\gdef^^ad{\-}9046\gdef^^ae{\v Z}9047\gdef^^af{\dotaccent Z}9048%9049\gdef^^b0{\textdegree}9050\gdef^^b1{\ogonek{a}}9051\gdef^^b2{\ogonek{ }}9052\gdef^^b3{\l}9053\gdef^^b4{\'{}}9054\gdef^^b5{\v l}9055\gdef^^b6{\'s}9056\gdef^^b7{\v{}}9057\gdef^^b8{\cedilla\ }9058\gdef^^b9{\v s}9059\gdef^^ba{\cedilla s}9060\gdef^^bb{\v t}9061\gdef^^bc{\'z}9062\gdef^^bd{\H{}}9063\gdef^^be{\v z}9064\gdef^^bf{\dotaccent z}9065%9066\gdef^^c0{\'R}9067\gdef^^c1{\'A}9068\gdef^^c2{\^A}9069\gdef^^c3{\u A}9070\gdef^^c4{\"A}9071\gdef^^c5{\'L}9072\gdef^^c6{\'C}9073\gdef^^c7{\cedilla C}9074\gdef^^c8{\v C}9075\gdef^^c9{\'E}9076\gdef^^ca{\ogonek{E}}9077\gdef^^cb{\"E}9078\gdef^^cc{\v E}9079\gdef^^cd{\'I}9080\gdef^^ce{\^I}9081\gdef^^cf{\v D}9082%9083\gdef^^d0{\DH}9084\gdef^^d1{\'N}9085\gdef^^d2{\v N}9086\gdef^^d3{\'O}9087\gdef^^d4{\^O}9088\gdef^^d5{\H O}9089\gdef^^d6{\"O}9090\gdef^^d7{$\times$}9091\gdef^^d8{\v R}9092\gdef^^d9{\ringaccent U}9093\gdef^^da{\'U}9094\gdef^^db{\H U}9095\gdef^^dc{\"U}9096\gdef^^dd{\'Y}9097\gdef^^de{\cedilla T}9098\gdef^^df{\ss}9099%9100\gdef^^e0{\'r}9101\gdef^^e1{\'a}9102\gdef^^e2{\^a}9103\gdef^^e3{\u a}9104\gdef^^e4{\"a}9105\gdef^^e5{\'l}9106\gdef^^e6{\'c}9107\gdef^^e7{\cedilla c}9108\gdef^^e8{\v c}9109\gdef^^e9{\'e}9110\gdef^^ea{\ogonek{e}}9111\gdef^^eb{\"e}9112\gdef^^ec{\v e}9113\gdef^^ed{\'{\dotless{i}}}9114\gdef^^ee{\^{\dotless{i}}}9115\gdef^^ef{\v d}9116%9117\gdef^^f0{\dh}9118\gdef^^f1{\'n}9119\gdef^^f2{\v n}9120\gdef^^f3{\'o}9121\gdef^^f4{\^o}9122\gdef^^f5{\H o}9123\gdef^^f6{\"o}9124\gdef^^f7{$\div$}9125\gdef^^f8{\v r}9126\gdef^^f9{\ringaccent u}9127\gdef^^fa{\'u}9128\gdef^^fb{\H u}9129\gdef^^fc{\"u}9130\gdef^^fd{\'y}9131\gdef^^fe{\cedilla t}9132\gdef^^ff{\dotaccent{}}9133}91349135% UTF-8 character definitions.9136%9137% This code to support UTF-8 is based on LaTeX's utf8.def, with some9138% changes for Texinfo conventions. It is included here under the GPL by9139% permission from Frank Mittelbach and the LaTeX team.9140%9141\newcount\countUTFx9142\newcount\countUTFy9143\newcount\countUTFz91449145\gdef\UTFviiiTwoOctets#1#2{\expandafter9146\UTFviiiDefined\csname u8:#1\string #2\endcsname}9147%9148\gdef\UTFviiiThreeOctets#1#2#3{\expandafter9149\UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}9150%9151\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter9152\UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}91539154\gdef\UTFviiiDefined#1{%9155\ifx #1\relax9156\message{\linenumber Unicode char \string #1 not defined for Texinfo}%9157\else9158\expandafter #1%9159\fi9160}91619162\begingroup9163\catcode`\~139164\catcode`\"1291659166\def\UTFviiiLoop{%9167\global\catcode\countUTFx\active9168\uccode`\~\countUTFx9169\uppercase\expandafter{\UTFviiiTmp}%9170\advance\countUTFx by 19171\ifnum\countUTFx < \countUTFy9172\expandafter\UTFviiiLoop9173\fi}91749175\countUTFx = "C29176\countUTFy = "E09177\def\UTFviiiTmp{%9178\xdef~{\noexpand\UTFviiiTwoOctets\string~}}9179\UTFviiiLoop91809181\countUTFx = "E09182\countUTFy = "F09183\def\UTFviiiTmp{%9184\xdef~{\noexpand\UTFviiiThreeOctets\string~}}9185\UTFviiiLoop91869187\countUTFx = "F09188\countUTFy = "F49189\def\UTFviiiTmp{%9190\xdef~{\noexpand\UTFviiiFourOctets\string~}}9191\UTFviiiLoop9192\endgroup91939194\begingroup9195\catcode`\"=129196\catcode`\<=129197\catcode`\.=129198\catcode`\,=129199\catcode`\;=129200\catcode`\!=129201\catcode`\~=1392029203\gdef\DeclareUnicodeCharacter#1#2{%9204\countUTFz = "#1\relax9205%\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%9206\begingroup9207\parseXMLCharref9208\def\UTFviiiTwoOctets##1##2{%9209\csname u8:##1\string ##2\endcsname}%9210\def\UTFviiiThreeOctets##1##2##3{%9211\csname u8:##1\string ##2\string ##3\endcsname}%9212\def\UTFviiiFourOctets##1##2##3##4{%9213\csname u8:##1\string ##2\string ##3\string ##4\endcsname}%9214\expandafter\expandafter\expandafter\expandafter9215\expandafter\expandafter\expandafter9216\gdef\UTFviiiTmp{#2}%9217\endgroup}92189219\gdef\parseXMLCharref{%9220\ifnum\countUTFz < "A0\relax9221\errhelp = \EMsimple9222\errmessage{Cannot define Unicode char value < 00A0}%9223\else\ifnum\countUTFz < "800\relax9224\parseUTFviiiA,%9225\parseUTFviiiB C\UTFviiiTwoOctets.,%9226\else\ifnum\countUTFz < "10000\relax9227\parseUTFviiiA;%9228\parseUTFviiiA,%9229\parseUTFviiiB E\UTFviiiThreeOctets.{,;}%9230\else9231\parseUTFviiiA;%9232\parseUTFviiiA,%9233\parseUTFviiiA!%9234\parseUTFviiiB F\UTFviiiFourOctets.{!,;}%9235\fi\fi\fi9236}92379238\gdef\parseUTFviiiA#1{%9239\countUTFx = \countUTFz9240\divide\countUTFz by 649241\countUTFy = \countUTFz9242\multiply\countUTFz by 649243\advance\countUTFx by -\countUTFz9244\advance\countUTFx by 1289245\uccode `#1\countUTFx9246\countUTFz = \countUTFy}92479248\gdef\parseUTFviiiB#1#2#3#4{%9249\advance\countUTFz by "#10\relax9250\uccode `#3\countUTFz9251\uppercase{\gdef\UTFviiiTmp{#2#3#4}}}9252\endgroup92539254\def\utfeightchardefs{%9255\DeclareUnicodeCharacter{00A0}{\tie}9256\DeclareUnicodeCharacter{00A1}{\exclamdown}9257\DeclareUnicodeCharacter{00A3}{\pounds}9258\DeclareUnicodeCharacter{00A8}{\"{ }}9259\DeclareUnicodeCharacter{00A9}{\copyright}9260\DeclareUnicodeCharacter{00AA}{\ordf}9261\DeclareUnicodeCharacter{00AB}{\guillemetleft}9262\DeclareUnicodeCharacter{00AD}{\-}9263\DeclareUnicodeCharacter{00AE}{\registeredsymbol}9264\DeclareUnicodeCharacter{00AF}{\={ }}92659266\DeclareUnicodeCharacter{00B0}{\ringaccent{ }}9267\DeclareUnicodeCharacter{00B4}{\'{ }}9268\DeclareUnicodeCharacter{00B8}{\cedilla{ }}9269\DeclareUnicodeCharacter{00BA}{\ordm}9270\DeclareUnicodeCharacter{00BB}{\guillemetright}9271\DeclareUnicodeCharacter{00BF}{\questiondown}92729273\DeclareUnicodeCharacter{00C0}{\`A}9274\DeclareUnicodeCharacter{00C1}{\'A}9275\DeclareUnicodeCharacter{00C2}{\^A}9276\DeclareUnicodeCharacter{00C3}{\~A}9277\DeclareUnicodeCharacter{00C4}{\"A}9278\DeclareUnicodeCharacter{00C5}{\AA}9279\DeclareUnicodeCharacter{00C6}{\AE}9280\DeclareUnicodeCharacter{00C7}{\cedilla{C}}9281\DeclareUnicodeCharacter{00C8}{\`E}9282\DeclareUnicodeCharacter{00C9}{\'E}9283\DeclareUnicodeCharacter{00CA}{\^E}9284\DeclareUnicodeCharacter{00CB}{\"E}9285\DeclareUnicodeCharacter{00CC}{\`I}9286\DeclareUnicodeCharacter{00CD}{\'I}9287\DeclareUnicodeCharacter{00CE}{\^I}9288\DeclareUnicodeCharacter{00CF}{\"I}92899290\DeclareUnicodeCharacter{00D0}{\DH}9291\DeclareUnicodeCharacter{00D1}{\~N}9292\DeclareUnicodeCharacter{00D2}{\`O}9293\DeclareUnicodeCharacter{00D3}{\'O}9294\DeclareUnicodeCharacter{00D4}{\^O}9295\DeclareUnicodeCharacter{00D5}{\~O}9296\DeclareUnicodeCharacter{00D6}{\"O}9297\DeclareUnicodeCharacter{00D8}{\O}9298\DeclareUnicodeCharacter{00D9}{\`U}9299\DeclareUnicodeCharacter{00DA}{\'U}9300\DeclareUnicodeCharacter{00DB}{\^U}9301\DeclareUnicodeCharacter{00DC}{\"U}9302\DeclareUnicodeCharacter{00DD}{\'Y}9303\DeclareUnicodeCharacter{00DE}{\TH}9304\DeclareUnicodeCharacter{00DF}{\ss}93059306\DeclareUnicodeCharacter{00E0}{\`a}9307\DeclareUnicodeCharacter{00E1}{\'a}9308\DeclareUnicodeCharacter{00E2}{\^a}9309\DeclareUnicodeCharacter{00E3}{\~a}9310\DeclareUnicodeCharacter{00E4}{\"a}9311\DeclareUnicodeCharacter{00E5}{\aa}9312\DeclareUnicodeCharacter{00E6}{\ae}9313\DeclareUnicodeCharacter{00E7}{\cedilla{c}}9314\DeclareUnicodeCharacter{00E8}{\`e}9315\DeclareUnicodeCharacter{00E9}{\'e}9316\DeclareUnicodeCharacter{00EA}{\^e}9317\DeclareUnicodeCharacter{00EB}{\"e}9318\DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}9319\DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}9320\DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}9321\DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}93229323\DeclareUnicodeCharacter{00F0}{\dh}9324\DeclareUnicodeCharacter{00F1}{\~n}9325\DeclareUnicodeCharacter{00F2}{\`o}9326\DeclareUnicodeCharacter{00F3}{\'o}9327\DeclareUnicodeCharacter{00F4}{\^o}9328\DeclareUnicodeCharacter{00F5}{\~o}9329\DeclareUnicodeCharacter{00F6}{\"o}9330\DeclareUnicodeCharacter{00F8}{\o}9331\DeclareUnicodeCharacter{00F9}{\`u}9332\DeclareUnicodeCharacter{00FA}{\'u}9333\DeclareUnicodeCharacter{00FB}{\^u}9334\DeclareUnicodeCharacter{00FC}{\"u}9335\DeclareUnicodeCharacter{00FD}{\'y}9336\DeclareUnicodeCharacter{00FE}{\th}9337\DeclareUnicodeCharacter{00FF}{\"y}93389339\DeclareUnicodeCharacter{0100}{\=A}9340\DeclareUnicodeCharacter{0101}{\=a}9341\DeclareUnicodeCharacter{0102}{\u{A}}9342\DeclareUnicodeCharacter{0103}{\u{a}}9343\DeclareUnicodeCharacter{0104}{\ogonek{A}}9344\DeclareUnicodeCharacter{0105}{\ogonek{a}}9345\DeclareUnicodeCharacter{0106}{\'C}9346\DeclareUnicodeCharacter{0107}{\'c}9347\DeclareUnicodeCharacter{0108}{\^C}9348\DeclareUnicodeCharacter{0109}{\^c}9349\DeclareUnicodeCharacter{0118}{\ogonek{E}}9350\DeclareUnicodeCharacter{0119}{\ogonek{e}}9351\DeclareUnicodeCharacter{010A}{\dotaccent{C}}9352\DeclareUnicodeCharacter{010B}{\dotaccent{c}}9353\DeclareUnicodeCharacter{010C}{\v{C}}9354\DeclareUnicodeCharacter{010D}{\v{c}}9355\DeclareUnicodeCharacter{010E}{\v{D}}93569357\DeclareUnicodeCharacter{0112}{\=E}9358\DeclareUnicodeCharacter{0113}{\=e}9359\DeclareUnicodeCharacter{0114}{\u{E}}9360\DeclareUnicodeCharacter{0115}{\u{e}}9361\DeclareUnicodeCharacter{0116}{\dotaccent{E}}9362\DeclareUnicodeCharacter{0117}{\dotaccent{e}}9363\DeclareUnicodeCharacter{011A}{\v{E}}9364\DeclareUnicodeCharacter{011B}{\v{e}}9365\DeclareUnicodeCharacter{011C}{\^G}9366\DeclareUnicodeCharacter{011D}{\^g}9367\DeclareUnicodeCharacter{011E}{\u{G}}9368\DeclareUnicodeCharacter{011F}{\u{g}}93699370\DeclareUnicodeCharacter{0120}{\dotaccent{G}}9371\DeclareUnicodeCharacter{0121}{\dotaccent{g}}9372\DeclareUnicodeCharacter{0124}{\^H}9373\DeclareUnicodeCharacter{0125}{\^h}9374\DeclareUnicodeCharacter{0128}{\~I}9375\DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}9376\DeclareUnicodeCharacter{012A}{\=I}9377\DeclareUnicodeCharacter{012B}{\={\dotless{i}}}9378\DeclareUnicodeCharacter{012C}{\u{I}}9379\DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}93809381\DeclareUnicodeCharacter{0130}{\dotaccent{I}}9382\DeclareUnicodeCharacter{0131}{\dotless{i}}9383\DeclareUnicodeCharacter{0132}{IJ}9384\DeclareUnicodeCharacter{0133}{ij}9385\DeclareUnicodeCharacter{0134}{\^J}9386\DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}9387\DeclareUnicodeCharacter{0139}{\'L}9388\DeclareUnicodeCharacter{013A}{\'l}93899390\DeclareUnicodeCharacter{0141}{\L}9391\DeclareUnicodeCharacter{0142}{\l}9392\DeclareUnicodeCharacter{0143}{\'N}9393\DeclareUnicodeCharacter{0144}{\'n}9394\DeclareUnicodeCharacter{0147}{\v{N}}9395\DeclareUnicodeCharacter{0148}{\v{n}}9396\DeclareUnicodeCharacter{014C}{\=O}9397\DeclareUnicodeCharacter{014D}{\=o}9398\DeclareUnicodeCharacter{014E}{\u{O}}9399\DeclareUnicodeCharacter{014F}{\u{o}}94009401\DeclareUnicodeCharacter{0150}{\H{O}}9402\DeclareUnicodeCharacter{0151}{\H{o}}9403\DeclareUnicodeCharacter{0152}{\OE}9404\DeclareUnicodeCharacter{0153}{\oe}9405\DeclareUnicodeCharacter{0154}{\'R}9406\DeclareUnicodeCharacter{0155}{\'r}9407\DeclareUnicodeCharacter{0158}{\v{R}}9408\DeclareUnicodeCharacter{0159}{\v{r}}9409\DeclareUnicodeCharacter{015A}{\'S}9410\DeclareUnicodeCharacter{015B}{\'s}9411\DeclareUnicodeCharacter{015C}{\^S}9412\DeclareUnicodeCharacter{015D}{\^s}9413\DeclareUnicodeCharacter{015E}{\cedilla{S}}9414\DeclareUnicodeCharacter{015F}{\cedilla{s}}94159416\DeclareUnicodeCharacter{0160}{\v{S}}9417\DeclareUnicodeCharacter{0161}{\v{s}}9418\DeclareUnicodeCharacter{0162}{\cedilla{t}}9419\DeclareUnicodeCharacter{0163}{\cedilla{T}}9420\DeclareUnicodeCharacter{0164}{\v{T}}94219422\DeclareUnicodeCharacter{0168}{\~U}9423\DeclareUnicodeCharacter{0169}{\~u}9424\DeclareUnicodeCharacter{016A}{\=U}9425\DeclareUnicodeCharacter{016B}{\=u}9426\DeclareUnicodeCharacter{016C}{\u{U}}9427\DeclareUnicodeCharacter{016D}{\u{u}}9428\DeclareUnicodeCharacter{016E}{\ringaccent{U}}9429\DeclareUnicodeCharacter{016F}{\ringaccent{u}}94309431\DeclareUnicodeCharacter{0170}{\H{U}}9432\DeclareUnicodeCharacter{0171}{\H{u}}9433\DeclareUnicodeCharacter{0174}{\^W}9434\DeclareUnicodeCharacter{0175}{\^w}9435\DeclareUnicodeCharacter{0176}{\^Y}9436\DeclareUnicodeCharacter{0177}{\^y}9437\DeclareUnicodeCharacter{0178}{\"Y}9438\DeclareUnicodeCharacter{0179}{\'Z}9439\DeclareUnicodeCharacter{017A}{\'z}9440\DeclareUnicodeCharacter{017B}{\dotaccent{Z}}9441\DeclareUnicodeCharacter{017C}{\dotaccent{z}}9442\DeclareUnicodeCharacter{017D}{\v{Z}}9443\DeclareUnicodeCharacter{017E}{\v{z}}94449445\DeclareUnicodeCharacter{01C4}{D\v{Z}}9446\DeclareUnicodeCharacter{01C5}{D\v{z}}9447\DeclareUnicodeCharacter{01C6}{d\v{z}}9448\DeclareUnicodeCharacter{01C7}{LJ}9449\DeclareUnicodeCharacter{01C8}{Lj}9450\DeclareUnicodeCharacter{01C9}{lj}9451\DeclareUnicodeCharacter{01CA}{NJ}9452\DeclareUnicodeCharacter{01CB}{Nj}9453\DeclareUnicodeCharacter{01CC}{nj}9454\DeclareUnicodeCharacter{01CD}{\v{A}}9455\DeclareUnicodeCharacter{01CE}{\v{a}}9456\DeclareUnicodeCharacter{01CF}{\v{I}}94579458\DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}9459\DeclareUnicodeCharacter{01D1}{\v{O}}9460\DeclareUnicodeCharacter{01D2}{\v{o}}9461\DeclareUnicodeCharacter{01D3}{\v{U}}9462\DeclareUnicodeCharacter{01D4}{\v{u}}94639464\DeclareUnicodeCharacter{01E2}{\={\AE}}9465\DeclareUnicodeCharacter{01E3}{\={\ae}}9466\DeclareUnicodeCharacter{01E6}{\v{G}}9467\DeclareUnicodeCharacter{01E7}{\v{g}}9468\DeclareUnicodeCharacter{01E8}{\v{K}}9469\DeclareUnicodeCharacter{01E9}{\v{k}}94709471\DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}9472\DeclareUnicodeCharacter{01F1}{DZ}9473\DeclareUnicodeCharacter{01F2}{Dz}9474\DeclareUnicodeCharacter{01F3}{dz}9475\DeclareUnicodeCharacter{01F4}{\'G}9476\DeclareUnicodeCharacter{01F5}{\'g}9477\DeclareUnicodeCharacter{01F8}{\`N}9478\DeclareUnicodeCharacter{01F9}{\`n}9479\DeclareUnicodeCharacter{01FC}{\'{\AE}}9480\DeclareUnicodeCharacter{01FD}{\'{\ae}}9481\DeclareUnicodeCharacter{01FE}{\'{\O}}9482\DeclareUnicodeCharacter{01FF}{\'{\o}}94839484\DeclareUnicodeCharacter{021E}{\v{H}}9485\DeclareUnicodeCharacter{021F}{\v{h}}94869487\DeclareUnicodeCharacter{0226}{\dotaccent{A}}9488\DeclareUnicodeCharacter{0227}{\dotaccent{a}}9489\DeclareUnicodeCharacter{0228}{\cedilla{E}}9490\DeclareUnicodeCharacter{0229}{\cedilla{e}}9491\DeclareUnicodeCharacter{022E}{\dotaccent{O}}9492\DeclareUnicodeCharacter{022F}{\dotaccent{o}}94939494\DeclareUnicodeCharacter{0232}{\=Y}9495\DeclareUnicodeCharacter{0233}{\=y}9496\DeclareUnicodeCharacter{0237}{\dotless{j}}94979498\DeclareUnicodeCharacter{02DB}{\ogonek{ }}94999500\DeclareUnicodeCharacter{1E02}{\dotaccent{B}}9501\DeclareUnicodeCharacter{1E03}{\dotaccent{b}}9502\DeclareUnicodeCharacter{1E04}{\udotaccent{B}}9503\DeclareUnicodeCharacter{1E05}{\udotaccent{b}}9504\DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}9505\DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}9506\DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}9507\DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}9508\DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}9509\DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}9510\DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}9511\DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}95129513\DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}9514\DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}95159516\DeclareUnicodeCharacter{1E20}{\=G}9517\DeclareUnicodeCharacter{1E21}{\=g}9518\DeclareUnicodeCharacter{1E22}{\dotaccent{H}}9519\DeclareUnicodeCharacter{1E23}{\dotaccent{h}}9520\DeclareUnicodeCharacter{1E24}{\udotaccent{H}}9521\DeclareUnicodeCharacter{1E25}{\udotaccent{h}}9522\DeclareUnicodeCharacter{1E26}{\"H}9523\DeclareUnicodeCharacter{1E27}{\"h}95249525\DeclareUnicodeCharacter{1E30}{\'K}9526\DeclareUnicodeCharacter{1E31}{\'k}9527\DeclareUnicodeCharacter{1E32}{\udotaccent{K}}9528\DeclareUnicodeCharacter{1E33}{\udotaccent{k}}9529\DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}9530\DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}9531\DeclareUnicodeCharacter{1E36}{\udotaccent{L}}9532\DeclareUnicodeCharacter{1E37}{\udotaccent{l}}9533\DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}9534\DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}9535\DeclareUnicodeCharacter{1E3E}{\'M}9536\DeclareUnicodeCharacter{1E3F}{\'m}95379538\DeclareUnicodeCharacter{1E40}{\dotaccent{M}}9539\DeclareUnicodeCharacter{1E41}{\dotaccent{m}}9540\DeclareUnicodeCharacter{1E42}{\udotaccent{M}}9541\DeclareUnicodeCharacter{1E43}{\udotaccent{m}}9542\DeclareUnicodeCharacter{1E44}{\dotaccent{N}}9543\DeclareUnicodeCharacter{1E45}{\dotaccent{n}}9544\DeclareUnicodeCharacter{1E46}{\udotaccent{N}}9545\DeclareUnicodeCharacter{1E47}{\udotaccent{n}}9546\DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}9547\DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}95489549\DeclareUnicodeCharacter{1E54}{\'P}9550\DeclareUnicodeCharacter{1E55}{\'p}9551\DeclareUnicodeCharacter{1E56}{\dotaccent{P}}9552\DeclareUnicodeCharacter{1E57}{\dotaccent{p}}9553\DeclareUnicodeCharacter{1E58}{\dotaccent{R}}9554\DeclareUnicodeCharacter{1E59}{\dotaccent{r}}9555\DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}9556\DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}9557\DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}9558\DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}95599560\DeclareUnicodeCharacter{1E60}{\dotaccent{S}}9561\DeclareUnicodeCharacter{1E61}{\dotaccent{s}}9562\DeclareUnicodeCharacter{1E62}{\udotaccent{S}}9563\DeclareUnicodeCharacter{1E63}{\udotaccent{s}}9564\DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}9565\DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}9566\DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}9567\DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}9568\DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}9569\DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}95709571\DeclareUnicodeCharacter{1E7C}{\~V}9572\DeclareUnicodeCharacter{1E7D}{\~v}9573\DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}9574\DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}95759576\DeclareUnicodeCharacter{1E80}{\`W}9577\DeclareUnicodeCharacter{1E81}{\`w}9578\DeclareUnicodeCharacter{1E82}{\'W}9579\DeclareUnicodeCharacter{1E83}{\'w}9580\DeclareUnicodeCharacter{1E84}{\"W}9581\DeclareUnicodeCharacter{1E85}{\"w}9582\DeclareUnicodeCharacter{1E86}{\dotaccent{W}}9583\DeclareUnicodeCharacter{1E87}{\dotaccent{w}}9584\DeclareUnicodeCharacter{1E88}{\udotaccent{W}}9585\DeclareUnicodeCharacter{1E89}{\udotaccent{w}}9586\DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}9587\DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}9588\DeclareUnicodeCharacter{1E8C}{\"X}9589\DeclareUnicodeCharacter{1E8D}{\"x}9590\DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}9591\DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}95929593\DeclareUnicodeCharacter{1E90}{\^Z}9594\DeclareUnicodeCharacter{1E91}{\^z}9595\DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}9596\DeclareUnicodeCharacter{1E93}{\udotaccent{z}}9597\DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}9598\DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}9599\DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}9600\DeclareUnicodeCharacter{1E97}{\"t}9601\DeclareUnicodeCharacter{1E98}{\ringaccent{w}}9602\DeclareUnicodeCharacter{1E99}{\ringaccent{y}}96039604\DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}9605\DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}96069607\DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}9608\DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}9609\DeclareUnicodeCharacter{1EBC}{\~E}9610\DeclareUnicodeCharacter{1EBD}{\~e}96119612\DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}9613\DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}9614\DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}9615\DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}96169617\DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}9618\DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}96199620\DeclareUnicodeCharacter{1EF2}{\`Y}9621\DeclareUnicodeCharacter{1EF3}{\`y}9622\DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}96239624\DeclareUnicodeCharacter{1EF8}{\~Y}9625\DeclareUnicodeCharacter{1EF9}{\~y}96269627\DeclareUnicodeCharacter{2013}{--}9628\DeclareUnicodeCharacter{2014}{---}9629\DeclareUnicodeCharacter{2018}{\quoteleft}9630\DeclareUnicodeCharacter{2019}{\quoteright}9631\DeclareUnicodeCharacter{201A}{\quotesinglbase}9632\DeclareUnicodeCharacter{201C}{\quotedblleft}9633\DeclareUnicodeCharacter{201D}{\quotedblright}9634\DeclareUnicodeCharacter{201E}{\quotedblbase}9635\DeclareUnicodeCharacter{2022}{\bullet}9636\DeclareUnicodeCharacter{2026}{\dots}9637\DeclareUnicodeCharacter{2039}{\guilsinglleft}9638\DeclareUnicodeCharacter{203A}{\guilsinglright}9639\DeclareUnicodeCharacter{20AC}{\euro}96409641\DeclareUnicodeCharacter{2192}{\expansion}9642\DeclareUnicodeCharacter{21D2}{\result}96439644\DeclareUnicodeCharacter{2212}{\minus}9645\DeclareUnicodeCharacter{2217}{\point}9646\DeclareUnicodeCharacter{2261}{\equiv}9647}% end of \utfeightchardefs964896499650% US-ASCII character definitions.9651\def\asciichardefs{% nothing need be done9652\relax9653}96549655% Make non-ASCII characters printable again for compatibility with9656% existing Texinfo documents that may use them, even without declaring a9657% document encoding.9658%9659\setnonasciicharscatcode \other966096619662\message{formatting,}96639664\newdimen\defaultparindent \defaultparindent = 15pt96659666\chapheadingskip = 15pt plus 4pt minus 2pt9667\secheadingskip = 12pt plus 3pt minus 2pt9668\subsecheadingskip = 9pt plus 2pt minus 2pt96699670% Prevent underfull vbox error messages.9671\vbadness = 1000096729673% Don't be very finicky about underfull hboxes, either.9674\hbadness = 666696759676% Following George Bush, get rid of widows and orphans.9677\widowpenalty=100009678\clubpenalty=1000096799680% Use TeX 3.0's \emergencystretch to help line breaking, but if we're9681% using an old version of TeX, don't do anything. We want the amount of9682% stretch added to depend on the line length, hence the dependence on9683% \hsize. We call this whenever the paper size is set.9684%9685\def\setemergencystretch{%9686\ifx\emergencystretch\thisisundefined9687% Allow us to assign to \emergencystretch anyway.9688\def\emergencystretch{\dimen0}%9689\else9690\emergencystretch = .15\hsize9691\fi9692}96939694% Parameters in order: 1) textheight; 2) textwidth;9695% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;9696% 7) physical page height; 8) physical page width.9697%9698% We also call \setleading{\textleading}, so the caller should define9699% \textleading. The caller should also set \parskip.9700%9701\def\internalpagesizes#1#2#3#4#5#6#7#8{%9702\voffset = #3\relax9703\topskip = #6\relax9704\splittopskip = \topskip9705%9706\vsize = #1\relax9707\advance\vsize by \topskip9708\outervsize = \vsize9709\advance\outervsize by 2\topandbottommargin9710\pageheight = \vsize9711%9712\hsize = #2\relax9713\outerhsize = \hsize9714\advance\outerhsize by 0.5in9715\pagewidth = \hsize9716%9717\normaloffset = #4\relax9718\bindingoffset = #5\relax9719%9720\ifpdf9721\pdfpageheight #7\relax9722\pdfpagewidth #8\relax9723% if we don't reset these, they will remain at "1 true in" of9724% whatever layout pdftex was dumped with.9725\pdfhorigin = 1 true in9726\pdfvorigin = 1 true in9727\fi9728%9729\setleading{\textleading}9730%9731\parindent = \defaultparindent9732\setemergencystretch9733}97349735% @letterpaper (the default).9736\def\letterpaper{{\globaldefs = 19737\parskip = 3pt plus 2pt minus 1pt9738\textleading = 13.2pt9739%9740% If page is nothing but text, make it come out even.9741\internalpagesizes{607.2pt}{6in}% that's 46 lines9742{\voffset}{.25in}%9743{\bindingoffset}{36pt}%9744{11in}{8.5in}%9745}}97469747% Use @smallbook to reset parameters for 7x9.25 trim size.9748\def\smallbook{{\globaldefs = 19749\parskip = 2pt plus 1pt9750\textleading = 12pt9751%9752\internalpagesizes{7.5in}{5in}%9753{-.2in}{0in}%9754{\bindingoffset}{16pt}%9755{9.25in}{7in}%9756%9757\lispnarrowing = 0.3in9758\tolerance = 7009759\hfuzz = 1pt9760\contentsrightmargin = 0pt9761\defbodyindent = .5cm9762}}97639764% Use @smallerbook to reset parameters for 6x9 trim size.9765% (Just testing, parameters still in flux.)9766\def\smallerbook{{\globaldefs = 19767\parskip = 1.5pt plus 1pt9768\textleading = 12pt9769%9770\internalpagesizes{7.4in}{4.8in}%9771{-.2in}{-.4in}%9772{0pt}{14pt}%9773{9in}{6in}%9774%9775\lispnarrowing = 0.25in9776\tolerance = 7009777\hfuzz = 1pt9778\contentsrightmargin = 0pt9779\defbodyindent = .4cm9780}}97819782% Use @afourpaper to print on European A4 paper.9783\def\afourpaper{{\globaldefs = 19784\parskip = 3pt plus 2pt minus 1pt9785\textleading = 13.2pt9786%9787% Double-side printing via postscript on Laserjet 40509788% prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.9789% To change the settings for a different printer or situation, adjust9790% \normaloffset until the front-side and back-side texts align. Then9791% do the same for \bindingoffset. You can set these for testing in9792% your texinfo source file like this:9793% @tex9794% \global\normaloffset = -6mm9795% \global\bindingoffset = 10mm9796% @end tex9797\internalpagesizes{673.2pt}{160mm}% that's 51 lines9798{\voffset}{\hoffset}%9799{\bindingoffset}{44pt}%9800{297mm}{210mm}%9801%9802\tolerance = 7009803\hfuzz = 1pt9804\contentsrightmargin = 0pt9805\defbodyindent = 5mm9806}}98079808% Use @afivepaper to print on European A5 paper.9809% From [email protected], 2 July 2000.9810% He also recommends making @example and @lisp be small.9811\def\afivepaper{{\globaldefs = 19812\parskip = 2pt plus 1pt minus 0.1pt9813\textleading = 12.5pt9814%9815\internalpagesizes{160mm}{120mm}%9816{\voffset}{\hoffset}%9817{\bindingoffset}{8pt}%9818{210mm}{148mm}%9819%9820\lispnarrowing = 0.2in9821\tolerance = 8009822\hfuzz = 1.2pt9823\contentsrightmargin = 0pt9824\defbodyindent = 2mm9825\tableindent = 12mm9826}}98279828% A specific text layout, 24x15cm overall, intended for A4 paper.9829\def\afourlatex{{\globaldefs = 19830\afourpaper9831\internalpagesizes{237mm}{150mm}%9832{\voffset}{4.6mm}%9833{\bindingoffset}{7mm}%9834{297mm}{210mm}%9835%9836% Must explicitly reset to 0 because we call \afourpaper.9837\globaldefs = 09838}}98399840% Use @afourwide to print on A4 paper in landscape format.9841\def\afourwide{{\globaldefs = 19842\afourpaper9843\internalpagesizes{241mm}{165mm}%9844{\voffset}{-2.95mm}%9845{\bindingoffset}{7mm}%9846{297mm}{210mm}%9847\globaldefs = 09848}}98499850% @pagesizes TEXTHEIGHT[,TEXTWIDTH]9851% Perhaps we should allow setting the margins, \topskip, \parskip,9852% and/or leading, also. Or perhaps we should compute them somehow.9853%9854\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}9855\def\pagesizesyyy#1,#2,#3\finish{{%9856\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi9857\globaldefs = 19858%9859\parskip = 3pt plus 2pt minus 1pt9860\setleading{\textleading}%9861%9862\dimen0 = #1\relax9863\advance\dimen0 by \voffset9864%9865\dimen2 = \hsize9866\advance\dimen2 by \normaloffset9867%9868\internalpagesizes{#1}{\hsize}%9869{\voffset}{\normaloffset}%9870{\bindingoffset}{44pt}%9871{\dimen0}{\dimen2}%9872}}98739874% Set default to letter.9875%9876\letterpaper987798789879\message{and turning on texinfo input format.}98809881\def^^L{\par} % remove \outer, so ^L can appear in an @comment98829883% DEL is a comment character, in case @c does not suffice.9884\catcode`\^^? = 1498859886% Define macros to output various characters with catcode for normal text.9887\catcode`\"=\other \def\normaldoublequote{"}9888\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix9889\catcode`\+=\other \def\normalplus{+}9890\catcode`\<=\other \def\normalless{<}9891\catcode`\>=\other \def\normalgreater{>}9892\catcode`\^=\other \def\normalcaret{^}9893\catcode`\_=\other \def\normalunderscore{_}9894\catcode`\|=\other \def\normalverticalbar{|}9895\catcode`\~=\other \def\normaltilde{~}98969897% This macro is used to make a character print one way in \tt9898% (where it can probably be output as-is), and another way in other fonts,9899% where something hairier probably needs to be done.9900%9901% #1 is what to print if we are indeed using \tt; #2 is what to print9902% otherwise. Since all the Computer Modern typewriter fonts have zero9903% interword stretch (and shrink), and it is reasonable to expect all9904% typewriter fonts to have this, we can check that font parameter.9905%9906\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}99079908% Same as above, but check for italic font. Actually this also catches9909% non-italic slanted fonts since it is impossible to distinguish them from9910% italic fonts. But since this is only used by $ and it uses \sl anyway9911% this is not a problem.9912\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}99139914% Turn off all special characters except @9915% (and those which the user can use as if they were ordinary).9916% Most of these we simply print from the \tt font, but for some, we can9917% use math or other variants that look better in normal text.99189919\catcode`\"=\active9920\def\activedoublequote{{\tt\char34}}9921\let"=\activedoublequote9922\catcode`\~=\active9923\def~{{\tt\char126}}9924\chardef\hat=`\^9925\catcode`\^=\active9926\def^{{\tt \hat}}99279928\catcode`\_=\active9929\def_{\ifusingtt\normalunderscore\_}9930\let\realunder=_9931% Subroutine for the previous macro.9932\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }99339934\catcode`\|=\active9935\def|{{\tt\char124}}9936\chardef \less=`\<9937\catcode`\<=\active9938\def<{{\tt \less}}9939\chardef \gtr=`\>9940\catcode`\>=\active9941\def>{{\tt \gtr}}9942\catcode`\+=\active9943\def+{{\tt \char 43}}9944\catcode`\$=\active9945\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix99469947% If a .fmt file is being used, characters that might appear in a file9948% name cannot be active until we have parsed the command line.9949% So turn them off again, and have \everyjob (or @setfilename) turn them on.9950% \otherifyactive is called near the end of this file.9951\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}99529953% Used sometimes to turn off (effectively) the active characters even after9954% parsing them.9955\def\turnoffactive{%9956\normalturnoffactive9957\otherbackslash9958}99599960\catcode`\@=099619962% \backslashcurfont outputs one backslash character in current font,9963% as in \char`\\.9964\global\chardef\backslashcurfont=`\\9965\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work99669967% \realbackslash is an actual character `\' with catcode other, and9968% \doublebackslash is two of them (for the pdf outlines).9969{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}99709971% In texinfo, backslash is an active character; it prints the backslash9972% in fixed width font.9973\catcode`\\=\active % @ for escape char from now on.99749975% The story here is that in math mode, the \char of \backslashcurfont9976% ends up printing the roman \ from the math symbol font (because \char9977% in math mode uses the \mathcode, and plain.tex sets9978% \mathcode`\\="026E). It seems better for @backslashchar{} to always9979% print a typewriter backslash, hence we use an explicit \mathchar,9980% which is the decimal equivalent of "715c (class 7, e.g., use \fam;9981% ignored family value; char position "5C). We can't use " for the9982% usual hex value because it has already been made active.9983@def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}9984@let@backslashchar = @normalbackslash % @backslashchar{} is for user documents.99859986% On startup, @fixbackslash assigns:9987% @let \ = @normalbackslash9988% \rawbackslash defines an active \ to do \backslashcurfont.9989% \otherbackslash defines an active \ to be a literal `\' character with9990% catcode other. We switch back and forth between these.9991@gdef@rawbackslash{@let\=@backslashcurfont}9992@gdef@otherbackslash{@let\=@realbackslash}99939994% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of9995% the literal character `\'. Also revert - to its normal character, in9996% case the active - from code has slipped in.9997%9998{@catcode`- = @active9999@gdef@normalturnoffactive{%10000@let-=@normaldash10001@let"=@normaldoublequote10002@let$=@normaldollar %$ font-lock fix10003@let+=@normalplus10004@let<=@normalless10005@let>=@normalgreater10006@let\=@normalbackslash10007@let^=@normalcaret10008@let_=@normalunderscore10009@let|=@normalverticalbar10010@let~=@normaltilde10011@markupsetuplqdefault10012@markupsetuprqdefault10013@unsepspaces10014}10015}1001610017% Make _ and + \other characters, temporarily.10018% This is canceled by @fixbackslash.10019@otherifyactive1002010021% If a .fmt file is being used, we don't want the `\input texinfo' to show up.10022% That is what \eatinput is for; after that, the `\' should revert to printing10023% a backslash.10024%10025@gdef@eatinput input texinfo{@fixbackslash}10026@global@let\ = @eatinput1002710028% On the other hand, perhaps the file did not have a `\input texinfo'. Then10029% the first `\' in the file would cause an error. This macro tries to fix10030% that, assuming it is called before the first `\' could plausibly occur.10031% Also turn back on active characters that might appear in the input10032% file name, in case not using a pre-dumped format.10033%10034@gdef@fixbackslash{%10035@ifx\@eatinput @let\ = @normalbackslash @fi10036@catcode`+=@active10037@catcode`@_=@active10038}1003910040% Say @foo, not \foo, in error messages.10041@escapechar = `@@1004210043% These (along with & and #) are made active for url-breaking, so need10044% active definitions as the normal characters.10045@def@normaldot{.}10046@def@normalquest{?}10047@def@normalslash{/}1004810049% These look ok in all fonts, so just make them not special.10050% @hashchar{} gets its own user-level command, because of #line.10051@catcode`@& = @other @def@normalamp{&}10052@catcode`@# = @other @def@normalhash{#}10053@catcode`@% = @other @def@normalpercent{%}1005410055@let @hashchar = @normalhash1005610057@c Finally, make ` and ' active, so that txicodequoteundirected and10058@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we10059@c don't make ` and ' active, @code will not get them as active chars.10060@c Do this last of all since we use ` in the previous @catcode assignments.10061@catcode`@'=@active10062@catcode`@`=@active10063@markupsetuplqdefault10064@markupsetuprqdefault1006510066@c Local variables:10067@c eval: (add-hook 'write-file-hooks 'time-stamp)10068@c page-delimiter: "^\\\\message"10069@c time-stamp-start: "def\\\\texinfoversion{"10070@c time-stamp-format: "%:y-%02m-%02d.%02H"10071@c time-stamp-end: "}"10072@c End:1007310074@c vim:sw=2:1007510076@ignore10077arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea11510078@end ignore100791008010081