version 1.1.1.2, 2000/09/09 14:12:15 |
version 1.1.1.3, 2003/08/25 16:05:59 |
|
|
% Load plain if necessary, i.e., if running under initex. |
% Load plain if necessary, i.e., if running under initex. |
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi |
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi |
% |
% |
\def\texinfoversion{1999-03-31.13}% |
\def\texinfoversion{2002-03-26.08} |
% |
% |
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 |
% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, |
% Free Software Foundation, Inc. |
% 2000, 01, 02 Free Software Foundation, Inc. |
% |
% |
% This texinfo.tex file is free software; you can redistribute it and/or |
% This texinfo.tex file is free software; you can redistribute it and/or |
% modify it under the terms of the GNU General Public License as |
% modify it under the terms of the GNU General Public License as |
|
|
% |
% |
% Please try the latest version of texinfo.tex before submitting bug |
% Please try the latest version of texinfo.tex before submitting bug |
% reports; you can get the latest version from: |
% reports; you can get the latest version from: |
% ftp://ftp.gnu.org/pub/gnu/texinfo.tex |
% ftp://ftp.gnu.org/gnu/texinfo.tex |
% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) |
% (and all GNU mirrors, see http://www.gnu.org/order/ftp.html) |
|
% ftp://texinfo.org/texinfo/texinfo.tex |
% ftp://tug.org/tex/texinfo.tex |
% ftp://tug.org/tex/texinfo.tex |
% ftp://ctan.org/macros/texinfo/texinfo.tex |
% (and all CTAN mirrors, see http://www.ctan.org), |
% (and all CTAN mirrors, finger ctan@ctan.org for a list). |
% and /home/gd/gnu/doc/texinfo.tex on the GNU machines. |
% /home/gd/gnu/doc/texinfo.tex on the GNU machines. |
% |
% The texinfo.tex in any given Texinfo distribution could well be out |
% The texinfo.tex in any given Texinfo distribution could well be out |
% of date, so if that's what you're using, please check. |
% of date, so if that's what you're using, please check. |
% There is a small home page for Texinfo at http://texinfo.org/. |
% |
|
% Texinfo has a small home page at http://texinfo.org/ and also |
|
% http://www.gnu.org/software/texinfo. |
% |
% |
% Send bug reports to bug-texinfo@gnu.org. Please include including a |
% Send bug reports to bug-texinfo@gnu.org. Please include including a |
% complete document in each bug report with which we can reproduce the |
% complete document in each bug report with which we can reproduce the |
|
|
% texindex foo.?? |
% texindex foo.?? |
% tex foo.texi |
% tex foo.texi |
% tex foo.texi |
% tex foo.texi |
% dvips foo.dvi -o # or whatever, to process the dvi file; this makes foo.ps. |
% dvips foo.dvi -o # or whatever; this makes foo.ps. |
% The extra runs of TeX get the cross-reference information correct. |
% The extra TeX runs get the cross-reference information correct. |
% Sometimes one run after texindex suffices, and sometimes you need more |
% Sometimes one run after texindex suffices, and sometimes you need more |
% than two; texi2dvi does it as many times as necessary. |
% than two; texi2dvi does it as many times as necessary. |
% |
% |
% It is possible to adapt texinfo.tex for other languages. You can get |
% It is possible to adapt texinfo.tex for other languages. You can get |
% the existing language-specific files from ftp://ftp.gnu.org/gnu/texinfo/. |
% the existing language-specific files from the full Texinfo distribution. |
|
|
\message{Loading texinfo [version \texinfoversion]:} |
\message{Loading texinfo [version \texinfoversion]:} |
|
|
|
|
\catcode`+=\active \catcode`\_=\active} |
\catcode`+=\active \catcode`\_=\active} |
|
|
% Save some parts of plain tex whose names we will redefine. |
% Save some parts of plain tex whose names we will redefine. |
|
|
\let\ptexb=\b |
\let\ptexb=\b |
\let\ptexbullet=\bullet |
\let\ptexbullet=\bullet |
\let\ptexc=\c |
\let\ptexc=\c |
|
|
% For @tex, we can use \tabalign. |
% For @tex, we can use \tabalign. |
\let\+ = \relax |
\let\+ = \relax |
|
|
|
|
\message{Basics,} |
\message{Basics,} |
\chardef\other=12 |
\chardef\other=12 |
|
|
|
|
}% |
}% |
\fi |
\fi |
|
|
|
% add check for \lastpenalty to plain's definitions. If the last thing |
|
% we did was a \nobreak, we don't want to insert more space. |
|
% |
|
\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount |
|
\removelastskip\penalty-50\smallskip\fi\fi} |
|
\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount |
|
\removelastskip\penalty-100\medskip\fi\fi} |
|
\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount |
|
\removelastskip\penalty-200\bigskip\fi\fi} |
|
|
% For @cropmarks command. |
% For @cropmarks command. |
% Do @cropmarks to get crop marks. |
% Do @cropmarks to get crop marks. |
% |
% |
|
|
\normalturnoffactive % \ in index entries must not stay \, e.g., if |
\normalturnoffactive % \ in index entries must not stay \, e.g., if |
% the page break happens to be in the middle of an example. |
% the page break happens to be in the middle of an example. |
\shipout\vbox{% |
\shipout\vbox{% |
|
% Do this early so pdf references go to the beginning of the page. |
|
\ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi |
|
% |
\ifcropmarks \vbox to \outervsize\bgroup |
\ifcropmarks \vbox to \outervsize\bgroup |
\hsize = \outerhsize |
\hsize = \outerhsize |
\vskip-\topandbottommargin |
\vskip-\topandbottommargin |
|
|
% environments. --karl, 6may93 |
% environments. --karl, 6may93 |
%{\advance \baselineskip by -\singlespaceskip |
%{\advance \baselineskip by -\singlespaceskip |
%\kern \baselineskip}% |
%\kern \baselineskip}% |
\setleading \singlespaceskip |
\setleading\singlespaceskip |
} |
} |
|
|
%% Simple single-character @ commands |
%% Simple single-character @ commands |
Line 599 where each line of input produces a line of output.} |
|
Line 613 where each line of input produces a line of output.} |
|
%}} |
%}} |
|
|
\def\needx#1{% |
\def\needx#1{% |
% Go into vertical mode, so we don't make a big box in the middle of a |
% Ensure vertical mode, so we don't make a big box in the middle of a |
% paragraph. |
% paragraph. |
\par |
\par |
% |
% |
% Don't add any leading before our big empty box, but allow a page |
% If the @need value is less than one line space, it's useless. |
% break, since the best break might be right here. |
\dimen0 = #1\mil |
\allowbreak |
\dimen2 = \ht\strutbox |
\nointerlineskip |
\advance\dimen2 by \dp\strutbox |
\vtop to #1\mil{\vfil}% |
\ifdim\dimen0 > \dimen2 |
% |
% |
% TeX does not even consider page breaks if a penalty added to the |
% Do a \strut just to make the height of this box be normal, so the |
% main vertical list is 10000 or more. But in order to see if the |
% normal leading is inserted relative to the preceding line. |
% empty box we just added fits on the page, we must make it consider |
% And a page break here is fine. |
% page breaks. On the other hand, we don't want to actually break the |
\vtop to #1\mil{\strut\vfil}% |
% page after the empty box. So we use a penalty of 9999. |
% |
% |
% TeX does not even consider page breaks if a penalty added to the |
% There is an extremely small chance that TeX will actually break the |
% main vertical list is 10000 or more. But in order to see if the |
% page at this \penalty, if there are no other feasible breakpoints in |
% empty box we just added fits on the page, we must make it consider |
% sight. (If the user is using lots of big @group commands, which |
% page breaks. On the other hand, we don't want to actually break the |
% almost-but-not-quite fill up a page, TeX will have a hard time doing |
% page after the empty box. So we use a penalty of 9999. |
% good page breaking, for example.) However, I could not construct an |
% |
% example where a page broke at this \penalty; if it happens in a real |
% There is an extremely small chance that TeX will actually break the |
% document, then we can reconsider our strategy. |
% page at this \penalty, if there are no other feasible breakpoints in |
\penalty9999 |
% sight. (If the user is using lots of big @group commands, which |
% |
% almost-but-not-quite fill up a page, TeX will have a hard time doing |
% Back up by the size of the box, whether we did a page break or not. |
% good page breaking, for example.) However, I could not construct an |
\kern -#1\mil |
% example where a page broke at this \penalty; if it happens in a real |
% |
% document, then we can reconsider our strategy. |
% Do not allow a page break right after this kern. |
\penalty9999 |
\nobreak |
% |
|
% Back up by the size of the box, whether we did a page break or not. |
|
\kern -#1\mil |
|
% |
|
% Do not allow a page break right after this kern. |
|
\nobreak |
|
\fi |
} |
} |
|
|
% @br forces paragraph break |
% @br forces paragraph break |
Line 681 where each line of input produces a line of output.} |
|
Line 701 where each line of input produces a line of output.} |
|
\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount |
\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount |
\leftline{\hskip\leftskip{\rm#1}}}} |
\leftline{\hskip\leftskip{\rm#1}}}} |
|
|
% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. |
% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current |
|
% paragraph. For more general purposes, use the \margin insertion |
\def\inmargin#1{% |
% class. WHICH is `l' or `r'. |
\strut\vadjust{\nobreak\kern-\strutdepth |
% |
\vtop to \strutdepth{\baselineskip\strutdepth\vss |
|
\llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}} |
|
\newskip\inmarginspacing \inmarginspacing=1cm |
\newskip\inmarginspacing \inmarginspacing=1cm |
\def\strutdepth{\dp\strutbox} |
\def\strutdepth{\dp\strutbox} |
|
% |
|
\def\doinmargin#1#2{\strut\vadjust{% |
|
\nobreak |
|
\kern-\strutdepth |
|
\vtop to \strutdepth{% |
|
\baselineskip=\strutdepth |
|
\vss |
|
% if you have multiple lines of stuff to put here, you'll need to |
|
% make the vbox yourself of the appropriate size. |
|
\ifx#1l% |
|
\llap{\ignorespaces #2\hskip\inmarginspacing}% |
|
\else |
|
\rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% |
|
\fi |
|
\null |
|
}% |
|
}} |
|
\def\inleftmargin{\doinmargin l} |
|
\def\inrightmargin{\doinmargin r} |
|
% |
|
% @inmargin{TEXT [, RIGHT-TEXT]} |
|
% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; |
|
% else use TEXT for both). |
|
% |
|
\def\inmargin#1{\parseinmargin #1,,\finish} |
|
\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. |
|
\setbox0 = \hbox{\ignorespaces #2}% |
|
\ifdim\wd0 > 0pt |
|
\def\lefttext{#1}% have both texts |
|
\def\righttext{#2}% |
|
\else |
|
\def\lefttext{#1}% have only one text |
|
\def\righttext{#1}% |
|
\fi |
|
% |
|
\ifodd\pageno |
|
\def\temp{\inrightmargin\righttext}% odd page -> outside is right margin |
|
\else |
|
\def\temp{\inleftmargin\lefttext}% |
|
\fi |
|
\temp |
|
} |
|
|
%\hbox{{\rm#1}}\hfil\break}} |
|
|
|
% @include file insert text of that file as input. |
% @include file insert text of that file as input. |
% Allow normal characters that we make active in the argument (a file name). |
% Allow normal characters that we make active in the argument (a file name). |
\def\include{\begingroup |
\def\include{\begingroup |
Line 778 where each line of input produces a line of output.} |
|
Line 836 where each line of input produces a line of output.} |
|
% |
% |
\def\asis#1{#1} |
\def\asis#1{#1} |
|
|
% @math means output in math mode. |
% @math outputs its argument in math mode. |
% We don't use $'s directly in the definition of \math because control |
% We don't use $'s directly in the definition of \math because we need |
% sequences like \math are expanded when the toc file is written. Then, |
% to set catcodes according to plain TeX first, to allow for subscripts, |
% we read the toc file back, the $'s will be normal characters (as they |
% superscripts, special math chars, etc. |
% should be, according to the definition of Texinfo). So we must use a |
% |
% control sequence to switch into and out of math mode. |
% @math does not do math typesetting in section titles, index |
|
% entries, and other such contexts where the catcodes are set before |
|
% @math gets a chance to work. This could perhaps be fixed, but for now |
|
% at least we can have real math in the main text, where it's needed most. |
% |
% |
% This isn't quite enough for @math to work properly in indices, but it |
\let\implicitmath = $%$ font-lock fix |
% seems unlikely it will ever be needed there. |
|
% |
% |
\let\implicitmath = $ |
% One complication: _ usually means subscripts, but it could also mean |
\def\math#1{\implicitmath #1\implicitmath} |
% an actual _ character, as in @math{@var{some_variable} + 1}. So make |
|
% _ within @math be active (mathcode "8000), and distinguish by seeing |
|
% if the current family is \slfam, which is what @var uses. |
|
% |
|
{\catcode95 = \active % 95 = _ |
|
\gdef\mathunderscore{% |
|
\catcode95=\active |
|
\def_{\ifnum\fam=\slfam \_\else\sb\fi}% |
|
}} |
|
% |
|
% Another complication: we want \\ (and @\) to output a \ character. |
|
% FYI, plain.tex uses \\ as a temporary control sequence (why?), but |
|
% this is not advertised and we don't care. Texinfo does not |
|
% otherwise define @\. |
|
% |
|
% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. |
|
\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} |
|
% |
|
\def\math{% |
|
\tex |
|
\mathcode`\_="8000 \mathunderscore |
|
\let\\ = \mathbackslash |
|
\implicitmath\finishmath} |
|
\def\finishmath#1{#1\implicitmath\Etex} |
|
|
% @bullet and @minus need the same treatment as @math, just above. |
% @bullet and @minus need the same treatment as @math, just above. |
\def\bullet{\implicitmath\ptexbullet\implicitmath} |
\def\bullet{\implicitmath\ptexbullet\implicitmath} |
Line 842 where each line of input produces a line of output.} |
|
Line 925 where each line of input produces a line of output.} |
|
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} |
\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} |
|
|
|
|
|
\message{pdf,} |
|
% adobe `portable' document format |
|
\newcount\tempnum |
|
\newcount\lnkcount |
|
\newtoks\filename |
|
\newcount\filenamelength |
|
\newcount\pgn |
|
\newtoks\toksA |
|
\newtoks\toksB |
|
\newtoks\toksC |
|
\newtoks\toksD |
|
\newbox\boxA |
|
\newcount\countA |
|
\newif\ifpdf |
|
\newif\ifpdfmakepagedest |
|
|
|
\ifx\pdfoutput\undefined |
|
\pdffalse |
|
\let\pdfmkdest = \gobble |
|
\let\pdfurl = \gobble |
|
\let\endlink = \relax |
|
\let\linkcolor = \relax |
|
\let\pdfmakeoutlines = \relax |
|
\else |
|
\pdftrue |
|
\pdfoutput = 1 |
|
\input pdfcolor |
|
\def\dopdfimage#1#2#3{% |
|
\def\imagewidth{#2}% |
|
\def\imageheight{#3}% |
|
% without \immediate, pdftex seg faults when the same image is |
|
% included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) |
|
\ifnum\pdftexversion < 14 |
|
\immediate\pdfimage |
|
\else |
|
\immediate\pdfximage |
|
\fi |
|
\ifx\empty\imagewidth\else width \imagewidth \fi |
|
\ifx\empty\imageheight\else height \imageheight \fi |
|
\ifnum\pdftexversion<13 |
|
#1.pdf% |
|
\else |
|
{#1.pdf}% |
|
\fi |
|
\ifnum\pdftexversion < 14 \else |
|
\pdfrefximage \pdflastximage |
|
\fi} |
|
\def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}} |
|
\def\pdfmkpgn#1{#1} |
|
\let\linkcolor = \Blue % was Cyan, but that seems light? |
|
\def\endlink{\Black\pdfendlink} |
|
% Adding outlines to PDF; macros for calculating structure of outlines |
|
% come from Petr Olsak |
|
\def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% |
|
\else \csname#1\endcsname \fi} |
|
\def\advancenumber#1{\tempnum=\expnumber{#1}\relax |
|
\advance\tempnum by1 |
|
\expandafter\xdef\csname#1\endcsname{\the\tempnum}} |
|
\def\pdfmakeoutlines{{% |
|
\openin 1 \jobname.toc |
|
\ifeof 1\else\begingroup |
|
\closein 1 |
|
\indexnofonts |
|
\def\tt{} |
|
\let\_ = \normalunderscore |
|
% Thanh's hack / proper braces in bookmarks |
|
\edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace |
|
\edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace |
|
% |
|
\def\chapentry ##1##2##3{} |
|
\let\appendixentry = \chapentry |
|
\def\unnumbchapentry ##1##2{} |
|
\def\secentry ##1##2##3##4{\advancenumber{chap##2}} |
|
\def\unnumbsecentry ##1##2##3{\advancenumber{chap##2}} |
|
\def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}} |
|
\def\unnumbsubsecentry ##1##2##3##4{\advancenumber{sec##2.##3}} |
|
\def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}} |
|
\def\unnumbsubsubsecentry ##1##2##3##4##5{\advancenumber{subsec##2.##3.##4}} |
|
\input \jobname.toc |
|
\def\chapentry ##1##2##3{% |
|
\pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}} |
|
\let\appendixentry = \chapentry |
|
\def\unnumbchapentry ##1##2{% |
|
\pdfoutline goto name{\pdfmkpgn{##2}}{##1}} |
|
\def\secentry ##1##2##3##4{% |
|
\pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}} |
|
\def\unnumbsecentry ##1##2##3{% |
|
\pdfoutline goto name{\pdfmkpgn{##3}}{##1}} |
|
\def\subsecentry ##1##2##3##4##5{% |
|
\pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}} |
|
\def\unnumbsubsecentry ##1##2##3##4{% |
|
\pdfoutline goto name{\pdfmkpgn{##4}}{##1}} |
|
\def\subsubsecentry ##1##2##3##4##5##6{% |
|
\pdfoutline goto name{\pdfmkpgn{##6}}{##1}} |
|
\def\unnumbsubsubsecentry ##1##2##3##4##5{% |
|
\pdfoutline goto name{\pdfmkpgn{##5}}{##1}} |
|
\input \jobname.toc |
|
\endgroup\fi |
|
}} |
|
\def\makelinks #1,{% |
|
\def\params{#1}\def\E{END}% |
|
\ifx\params\E |
|
\let\nextmakelinks=\relax |
|
\else |
|
\let\nextmakelinks=\makelinks |
|
\ifnum\lnkcount>0,\fi |
|
\picknum{#1}% |
|
\startlink attr{/Border [0 0 0]} |
|
goto name{\pdfmkpgn{\the\pgn}}% |
|
\linkcolor #1% |
|
\advance\lnkcount by 1% |
|
\endlink |
|
\fi |
|
\nextmakelinks |
|
} |
|
\def\picknum#1{\expandafter\pn#1} |
|
\def\pn#1{% |
|
\def\p{#1}% |
|
\ifx\p\lbrace |
|
\let\nextpn=\ppn |
|
\else |
|
\let\nextpn=\ppnn |
|
\def\first{#1} |
|
\fi |
|
\nextpn |
|
} |
|
\def\ppn#1{\pgn=#1\gobble} |
|
\def\ppnn{\pgn=\first} |
|
\def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} |
|
\def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} |
|
\def\skipspaces#1{\def\PP{#1}\def\D{|}% |
|
\ifx\PP\D\let\nextsp\relax |
|
\else\let\nextsp\skipspaces |
|
\ifx\p\space\else\addtokens{\filename}{\PP}% |
|
\advance\filenamelength by 1 |
|
\fi |
|
\fi |
|
\nextsp} |
|
\def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} |
|
\ifnum\pdftexversion < 14 |
|
\let \startlink \pdfannotlink |
|
\else |
|
\let \startlink \pdfstartlink |
|
\fi |
|
\def\pdfurl#1{% |
|
\begingroup |
|
\normalturnoffactive\def\@{@}% |
|
\let\value=\expandablevalue |
|
\leavevmode\Red |
|
\startlink attr{/Border [0 0 0]}% |
|
user{/Subtype /Link /A << /S /URI /URI (#1) >>}% |
|
% #1 |
|
\endgroup} |
|
\def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} |
|
\def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} |
|
\def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} |
|
\def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} |
|
\def\maketoks{% |
|
\expandafter\poptoks\the\toksA|ENDTOKS| |
|
\ifx\first0\adn0 |
|
\else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 |
|
\else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 |
|
\else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 |
|
\else |
|
\ifnum0=\countA\else\makelink\fi |
|
\ifx\first.\let\next=\done\else |
|
\let\next=\maketoks |
|
\addtokens{\toksB}{\the\toksD} |
|
\ifx\first,\addtokens{\toksB}{\space}\fi |
|
\fi |
|
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi |
|
\next} |
|
\def\makelink{\addtokens{\toksB}% |
|
{\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} |
|
\def\pdflink#1{% |
|
\startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} |
|
\linkcolor #1\endlink} |
|
\def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} |
|
\fi % \ifx\pdfoutput |
|
|
|
|
\message{fonts,} |
\message{fonts,} |
% Font-change commands. |
% Font-change commands. |
|
|
Line 854 where each line of input produces a line of output.} |
|
Line 1118 where each line of input produces a line of output.} |
|
% We don't need math for this one. |
% We don't need math for this one. |
\def\ttsl{\tenttsl} |
\def\ttsl{\tenttsl} |
|
|
% Use Computer Modern fonts at \magstephalf (11pt). |
% Default leading. |
\newcount\mainmagstep |
\newdimen\textleading \textleading = 13.2pt |
\mainmagstep=\magstephalf |
|
|
|
|
% Set the baselineskip to #1, and the lineskip and strut size |
|
% correspondingly. There is no deep meaning behind these magic numbers |
|
% used as factors; they just match (closely enough) what Knuth defined. |
|
% |
|
\def\lineskipfactor{.08333} |
|
\def\strutheightpercent{.70833} |
|
\def\strutdepthpercent {.29167} |
|
% |
|
\def\setleading#1{% |
|
\normalbaselineskip = #1\relax |
|
\normallineskip = \lineskipfactor\normalbaselineskip |
|
\normalbaselines |
|
\setbox\strutbox =\hbox{% |
|
\vrule width0pt height\strutheightpercent\baselineskip |
|
depth \strutdepthpercent \baselineskip |
|
}% |
|
} |
|
|
% Set the font macro #1 to the font named #2, adding on the |
% Set the font macro #1 to the font named #2, adding on the |
% specified font prefix (normally `cm'). |
% specified font prefix (normally `cm'). |
% #3 is the font's design size, #4 is a scale factor |
% #3 is the font's design size, #4 is a scale factor |
Line 886 where each line of input produces a line of output.} |
|
Line 1167 where each line of input produces a line of output.} |
|
\def\scshape{csc} |
\def\scshape{csc} |
\def\scbshape{csc} |
\def\scbshape{csc} |
|
|
|
\newcount\mainmagstep |
\ifx\bigger\relax |
\ifx\bigger\relax |
\let\mainmagstep=\magstep1 |
% not really supported. |
\setfont\textrm\rmshape{12}{1000} |
\let\mainmagstep=\magstep1 |
\setfont\texttt\ttshape{12}{1000} |
\setfont\textrm\rmshape{12}{1000} |
|
\setfont\texttt\ttshape{12}{1000} |
\else |
\else |
\setfont\textrm\rmshape{10}{\mainmagstep} |
\mainmagstep=\magstephalf |
\setfont\texttt\ttshape{10}{\mainmagstep} |
\setfont\textrm\rmshape{10}{\mainmagstep} |
|
\setfont\texttt\ttshape{10}{\mainmagstep} |
\fi |
\fi |
% Instead of cmb10, you many want to use cmbx10. |
% Instead of cmb10, you many want to use cmbx10. |
% cmbx10 is a prettier font on its own, but cmb10 |
% cmbx10 is a prettier font on its own, but cmb10 |
Line 911 where each line of input produces a line of output.} |
|
Line 1195 where each line of input produces a line of output.} |
|
\setfont\deftt\ttshape{10}{\magstep1} |
\setfont\deftt\ttshape{10}{\magstep1} |
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} |
\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} |
|
|
% Fonts for indices and small examples (9pt). |
% Fonts for indices, footnotes, small examples (9pt). |
% We actually use the slanted font rather than the italic, |
\setfont\smallrm\rmshape{9}{1000} |
% because texinfo normally uses the slanted fonts for that. |
\setfont\smalltt\ttshape{9}{1000} |
% Do not make many font distinctions in general in the index, since they |
\setfont\smallbf\bfshape{10}{900} |
% aren't very useful. |
\setfont\smallit\itshape{9}{1000} |
\setfont\ninett\ttshape{9}{1000} |
\setfont\smallsl\slshape{9}{1000} |
\setfont\ninettsl\ttslshape{10}{900} |
\setfont\smallsf\sfshape{9}{1000} |
\setfont\indrm\rmshape{9}{1000} |
\setfont\smallsc\scshape{10}{900} |
\setfont\indit\itshape{9}{1000} |
\setfont\smallttsl\ttslshape{10}{900} |
\setfont\indsl\slshape{9}{1000} |
\font\smalli=cmmi9 |
\let\indtt=\ninett |
\font\smallsy=cmsy9 |
\let\indttsl=\ninettsl |
|
\let\indsf=\indrm |
|
\let\indbf=\indrm |
|
\setfont\indsc\scshape{10}{900} |
|
\font\indi=cmmi9 |
|
\font\indsy=cmsy9 |
|
|
|
|
% Fonts for small examples (8pt). |
|
\setfont\smallerrm\rmshape{8}{1000} |
|
\setfont\smallertt\ttshape{8}{1000} |
|
\setfont\smallerbf\bfshape{10}{800} |
|
\setfont\smallerit\itshape{8}{1000} |
|
\setfont\smallersl\slshape{8}{1000} |
|
\setfont\smallersf\sfshape{8}{1000} |
|
\setfont\smallersc\scshape{10}{800} |
|
\setfont\smallerttsl\ttslshape{10}{800} |
|
\font\smalleri=cmmi8 |
|
\font\smallersy=cmsy8 |
|
|
% Fonts for title page: |
% Fonts for title page: |
\setfont\titlerm\rmbshape{12}{\magstep3} |
\setfont\titlerm\rmbshape{12}{\magstep3} |
\setfont\titleit\itbshape{10}{\magstep4} |
\setfont\titleit\itbshape{10}{\magstep4} |
Line 966 where each line of input produces a line of output.} |
|
Line 1256 where each line of input produces a line of output.} |
|
\font\seci=cmmi12 scaled \magstep1 |
\font\seci=cmmi12 scaled \magstep1 |
\font\secsy=cmsy10 scaled \magstep2 |
\font\secsy=cmsy10 scaled \magstep2 |
|
|
% \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad. |
|
% \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded. |
|
% \setfont\ssecsl\slshape{10}{\magstep1} |
|
% \setfont\ssectt\ttshape{10}{\magstep1} |
|
% \setfont\ssecsf\sfshape{10}{\magstep1} |
|
|
|
%\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx. |
|
%\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than |
|
%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. |
|
%\setfont\ssectt\ttshape{10}{1315} |
|
%\setfont\ssecsf\sfshape{10}{1315} |
|
|
|
%\let\ssecbf=\ssecrm |
|
|
|
% Subsection fonts (13.15pt). |
% Subsection fonts (13.15pt). |
\setfont\ssecrm\rmbshape{12}{\magstephalf} |
\setfont\ssecrm\rmbshape{12}{\magstephalf} |
\setfont\ssecit\itbshape{10}{1315} |
\setfont\ssecit\itbshape{10}{1315} |
Line 996 where each line of input produces a line of output.} |
|
Line 1272 where each line of input produces a line of output.} |
|
|
|
% In order for the font changes to affect most math symbols and letters, |
% In order for the font changes to affect most math symbols and letters, |
% we have to define the \textfont of the standard families. Since |
% we have to define the \textfont of the standard families. Since |
% texinfo doesn't allow for producing subscripts and superscripts, we |
% texinfo doesn't allow for producing subscripts and superscripts except |
% don't bother to reset \scriptfont and \scriptscriptfont (which would |
% in the main text, we don't bother to reset \scriptfont and |
% also require loading a lot more fonts). |
% \scriptscriptfont (which would also require loading a lot more fonts). |
% |
% |
\def\resetmathfonts{% |
\def\resetmathfonts{% |
\textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy |
\textfont0=\tenrm \textfont1=\teni \textfont2=\tensy |
\textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf |
\textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf |
\textfont\ttfam = \tentt \textfont\sffam = \tensf |
\textfont\ttfam=\tentt \textfont\sffam=\tensf |
} |
} |
|
|
|
|
% The font-changing commands redefine the meanings of \tenSTYLE, instead |
% The font-changing commands redefine the meanings of \tenSTYLE, instead |
% of just \STYLE. We do this so that font changes will continue to work |
% of just \STYLE. We do this so that font changes will continue to work |
% in math mode, where it is the current \fam that is relevant in most |
% in math mode, where it is the current \fam that is relevant in most |
Line 1017 where each line of input produces a line of output.} |
|
Line 1292 where each line of input produces a line of output.} |
|
\let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl |
\let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl |
\let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc |
\let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc |
\let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl |
\let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl |
\resetmathfonts} |
\resetmathfonts \setleading{\textleading}} |
\def\titlefonts{% |
\def\titlefonts{% |
\let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl |
\let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl |
\let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc |
\let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc |
Line 1041 where each line of input produces a line of output.} |
|
Line 1316 where each line of input produces a line of output.} |
|
\let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl |
\let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl |
\resetmathfonts \setleading{15pt}} |
\resetmathfonts \setleading{15pt}} |
\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? |
\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? |
\def\indexfonts{% |
\def\smallfonts{% |
\let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl |
\let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl |
\let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc |
\let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc |
\let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl |
\let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy |
\resetmathfonts \setleading{12pt}} |
\let\tenttsl=\smallttsl |
|
\resetmathfonts \setleading{10.5pt}} |
|
\def\smallerfonts{% |
|
\let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl |
|
\let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc |
|
\let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy |
|
\let\tenttsl=\smallerttsl |
|
\resetmathfonts \setleading{9.5pt}} |
|
\let\smallexamplefonts = \smallerfonts |
|
|
% Set up the default fonts, so we can use them for creating boxes. |
% Set up the default fonts, so we can use them for creating boxes. |
% |
% |
Line 1094 where each line of input produces a line of output.} |
|
Line 1377 where each line of input produces a line of output.} |
|
} |
} |
\let\ttfont=\t |
\let\ttfont=\t |
\def\samp#1{`\tclose{#1}'\null} |
\def\samp#1{`\tclose{#1}'\null} |
\setfont\smallrm\rmshape{8}{1000} |
\setfont\keyrm\rmshape{8}{1000} |
\font\smallsy=cmsy9 |
\font\keysy=cmsy9 |
\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{% |
\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% |
\raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% |
\raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% |
\vbox{\hrule\kern-0.4pt |
\vbox{\hrule\kern-0.4pt |
\hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% |
\hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% |
Line 1159 where each line of input produces a line of output.} |
|
Line 1442 where each line of input produces a line of output.} |
|
|
|
\def\realdash{-} |
\def\realdash{-} |
\def\codedash{-\discretionary{}{}{}} |
\def\codedash{-\discretionary{}{}{}} |
\def\codeunder{\ifusingtt{\normalunderscore\discretionary{}{}{}}{\_}} |
\def\codeunder{% |
|
% this is all so @math{@code{var_name}+1} can work. In math mode, _ |
|
% is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) |
|
% will therefore expand the active definition of _, which is us |
|
% (inside @code that is), therefore an endless loop. |
|
\ifusingtt{\ifmmode |
|
\mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. |
|
\else\normalunderscore \fi |
|
\discretionary{}{}{}}% |
|
{\_}% |
|
} |
\def\codex #1{\tclose{#1}\endgroup} |
\def\codex #1{\tclose{#1}\endgroup} |
|
|
%\let\exp=\tclose %Was temporary |
|
|
|
% @kbd is like @code, except that if the argument is just one @key command, |
% @kbd is like @code, except that if the argument is just one @key command, |
% then @kbd has no effect. |
% then @kbd has no effect. |
|
|
Line 1207 where each line of input produces a line of output.} |
|
Line 1498 where each line of input produces a line of output.} |
|
% a hypertex \special here. |
% a hypertex \special here. |
% |
% |
\def\uref#1{\douref #1,,,\finish} |
\def\uref#1{\douref #1,,,\finish} |
\def\douref#1,#2,#3,#4\finish{% |
\def\douref#1,#2,#3,#4\finish{\begingroup |
|
\unsepspaces |
|
\pdfurl{#1}% |
\setbox0 = \hbox{\ignorespaces #3}% |
\setbox0 = \hbox{\ignorespaces #3}% |
\ifdim\wd0 > 0pt |
\ifdim\wd0 > 0pt |
\unhbox0 % third arg given, show only that |
\unhbox0 % third arg given, show only that |
\else |
\else |
\setbox0 = \hbox{\ignorespaces #2}% |
\setbox0 = \hbox{\ignorespaces #2}% |
\ifdim\wd0 > 0pt |
\ifdim\wd0 > 0pt |
\unhbox0\ (\code{#1})% second arg given, show both it and url |
\ifpdf |
|
\unhbox0 % PDF: 2nd arg given, show only it |
|
\else |
|
\unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url |
|
\fi |
\else |
\else |
\code{#1}% only url given, so show it |
\code{#1}% only url given, so show it |
\fi |
\fi |
\fi |
\fi |
} |
\endlink |
|
\endgroup} |
|
|
% rms does not like the angle brackets --karl, 17may97. |
% rms does not like angle brackets --karl, 17may97. |
% So now @email is just like @uref. |
% So now @email is just like @uref, unless we are pdf. |
|
% |
%\def\email#1{\angleleft{\tt #1}\angleright} |
%\def\email#1{\angleleft{\tt #1}\angleright} |
\let\email=\uref |
\ifpdf |
|
\def\email#1{\doemail#1,,\finish} |
|
\def\doemail#1,#2,#3\finish{\begingroup |
|
\unsepspaces |
|
\pdfurl{mailto:#1}% |
|
\setbox0 = \hbox{\ignorespaces #2}% |
|
\ifdim\wd0>0pt\unhbox0\else\code{#1}\fi |
|
\endlink |
|
\endgroup} |
|
\else |
|
\let\email=\uref |
|
\fi |
|
|
% Check if we are currently using a typewriter font. Since all the |
% Check if we are currently using a typewriter font. Since all the |
% Computer Modern typewriter fonts have zero interword stretch (and |
% Computer Modern typewriter fonts have zero interword stretch (and |
Line 1329 where each line of input produces a line of output.} |
|
Line 1639 where each line of input produces a line of output.} |
|
\oldpage |
\oldpage |
\endgroup |
\endgroup |
% |
% |
|
% Need this before the \...aftertitlepage checks so that if they are |
|
% in effect the toc pages will come out with page numbers. |
|
\HEADINGSon |
|
% |
% If they want short, they certainly want long too. |
% If they want short, they certainly want long too. |
\ifsetshortcontentsaftertitlepage |
\ifsetshortcontentsaftertitlepage |
\shortcontents |
\shortcontents |
Line 1342 where each line of input produces a line of output.} |
|
Line 1656 where each line of input produces a line of output.} |
|
\global\let\contents = \relax |
\global\let\contents = \relax |
\global\let\shortcontents = \relax |
\global\let\shortcontents = \relax |
\fi |
\fi |
% |
|
\HEADINGSon |
|
} |
} |
|
|
\def\finishtitlepage{% |
\def\finishtitlepage{% |
Line 1476 where each line of input produces a line of output.} |
|
Line 1788 where each line of input produces a line of output.} |
|
} |
} |
|
|
% Subroutines used in generating headings |
% Subroutines used in generating headings |
% Produces Day Month Year style of output. |
% This produces Day Month Year style of output. |
|
% Only define if not already defined, in case a txi-??.tex file has set |
|
% up a different format (e.g., txi-cs.tex does this). |
|
\ifx\today\undefined |
\def\today{% |
\def\today{% |
\number\day\space |
\number\day\space |
\ifcase\month |
\ifcase\month |
Line 1485 where each line of input produces a line of output.} |
|
Line 1800 where each line of input produces a line of output.} |
|
\or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec |
\or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec |
\fi |
\fi |
\space\number\year} |
\space\number\year} |
|
\fi |
|
|
% @settitle line... specifies the title of the document, for headings. |
% @settitle line... specifies the title of the document, for headings. |
% It generates no output of its own. |
% It generates no output of its own. |
Line 1908 where each line of input produces a line of output.} |
|
Line 2224 where each line of input produces a line of output.} |
|
\go |
\go |
} |
} |
|
|
% multitable syntax |
% This used to have \hskip1sp. But then the space in a template line is |
\def\tab{&\hskip1sp\relax} % 2/2/96 |
% not enough. That is bad. So let's go back to just & until we |
% tiny skip here makes sure this column space is |
% encounter the problem it was intended to solve again. |
% maintained, even if it is never used. |
% --karl, nathan@acm.org, 20apr99. |
|
\def\tab{&} |
|
|
% @multitable ... @end multitable definitions: |
% @multitable ... @end multitable definitions: |
% |
% |
Line 1992 where each line of input produces a line of output.} |
|
Line 2309 where each line of input produces a line of output.} |
|
% If so, do nothing. If not, give it an appropriate dimension based on |
% If so, do nothing. If not, give it an appropriate dimension based on |
% current baselineskip. |
% current baselineskip. |
\ifdim\multitablelinespace=0pt |
\ifdim\multitablelinespace=0pt |
|
\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip |
|
\global\advance\multitablelinespace by-\ht0 |
%% strut to put in table in case some entry doesn't have descenders, |
%% strut to put in table in case some entry doesn't have descenders, |
%% to keep lines equally spaced |
%% to keep lines equally spaced |
\let\multistrut = \strut |
\let\multistrut = \strut |
%% Test to see if parskip is larger than space between lines of |
|
%% table. If not, do nothing. |
|
%% If so, set to same dimension as multitablelinespace. |
|
\else |
\else |
|
%% FIXME: what is \box0 supposed to be? |
\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 |
\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 |
width0pt\relax} \fi |
width0pt\relax} \fi |
|
%% Test to see if parskip is larger than space between lines of |
|
%% table. If not, do nothing. |
|
%% If so, set to same dimension as multitablelinespace. |
\ifdim\multitableparskip>\multitablelinespace |
\ifdim\multitableparskip>\multitablelinespace |
\global\multitableparskip=\multitablelinespace |
\global\multitableparskip=\multitablelinespace |
\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller |
\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller |
Line 2063 width0pt\relax} \fi |
|
Line 2383 width0pt\relax} \fi |
|
\let\deftypefn = \relax |
\let\deftypefn = \relax |
\let\deftypefun = \relax |
\let\deftypefun = \relax |
\let\deftypeivar = \relax |
\let\deftypeivar = \relax |
|
\let\deftypeop = \relax |
\let\deftypevar = \relax |
\let\deftypevar = \relax |
\let\deftypevr = \relax |
\let\deftypevr = \relax |
\let\defun = \relax |
\let\defun = \relax |
Line 2092 width0pt\relax} \fi |
|
Line 2413 width0pt\relax} \fi |
|
\let\item = \relax |
\let\item = \relax |
} |
} |
|
|
% Ignore @ignore ... @end ignore. |
% Ignore @ignore, @ifhtml, @ifinfo, @ifplaintext, @ifnottex, @html, @menu, |
|
% @direntry, and @documentdescription. |
% |
% |
\def\ignore{\doignore{ignore}} |
\def\ignore{\doignore{ignore}} |
|
|
% Ignore @ifinfo, @ifhtml, @ifnottex, @html, @menu, and @direntry text. |
|
% |
|
\def\ifinfo{\doignore{ifinfo}} |
|
\def\ifhtml{\doignore{ifhtml}} |
\def\ifhtml{\doignore{ifhtml}} |
|
\def\ifinfo{\doignore{ifinfo}} |
|
\def\ifplaintext{\doignore{ifplaintext}} |
\def\ifnottex{\doignore{ifnottex}} |
\def\ifnottex{\doignore{ifnottex}} |
\def\html{\doignore{html}} |
\def\html{\doignore{html}} |
\def\menu{\doignore{menu}} |
\def\menu{\doignore{menu}} |
\def\direntry{\doignore{direntry}} |
\def\direntry{\doignore{direntry}} |
|
\def\documentdescription{\doignore{documentdescription}} |
|
\def\documentdescriptionword{documentdescription} |
|
|
% @dircategory CATEGORY -- specify a category of the dir file |
% @dircategory CATEGORY -- specify a category of the dir file |
% which this file should belong to. Ignore this in TeX. |
% which this file should belong to. Ignore this in TeX. |
Line 2130 width0pt\relax} \fi |
|
Line 2452 width0pt\relax} \fi |
|
% We must not have @c interpreted as a control sequence. |
% We must not have @c interpreted as a control sequence. |
\catcode`\@ = 12 |
\catcode`\@ = 12 |
% |
% |
% Make the letter c a comment character so that the rest of the line |
\def\ignoreword{#1}% |
% will be ignored. This way, the document can have (for example) |
\ifx\ignoreword\documentdescriptionword |
% @c @end ifinfo |
% The c kludge breaks documentdescription, since |
% and the @end ifinfo will be properly ignored. |
% `documentdescription' contains a `c'. Means not everything will |
% (We've just changed @ to catcode 12.) |
% be ignored inside @documentdescription, but oh well... |
\catcode`\c = 14 |
\else |
|
% Make the letter c a comment character so that the rest of the line |
|
% will be ignored. This way, the document can have (for example) |
|
% @c @end ifinfo |
|
% and the @end ifinfo will be properly ignored. |
|
% (We've just changed @ to catcode 12.) |
|
\catcode`\c = 14 |
|
\fi |
% |
% |
% And now expand that command. |
% And now expand the command defined above. |
\doignoretext |
\doignoretext |
} |
} |
|
|
Line 2206 width0pt\relax} \fi |
|
Line 2535 width0pt\relax} \fi |
|
% stuff compared to the main input. |
% stuff compared to the main input. |
% |
% |
\nullfont |
\nullfont |
\let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont |
\let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont |
\let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont |
\let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont |
\let\tensf = \nullfont |
\let\tensf=\nullfont |
% Similarly for index fonts (mostly for their use in |
% Similarly for index fonts. |
% smallexample) |
\let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont |
\let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont |
\let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont |
\let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont |
\let\smallsf=\nullfont |
\let\indsf = \nullfont |
% Similarly for smallexample fonts. |
|
\let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont |
|
\let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont |
|
\let\smallersf=\nullfont |
% |
% |
% Don't complain when characters are missing from the fonts. |
% Don't complain when characters are missing from the fonts. |
\tracinglostchars = 0 |
\tracinglostchars = 0 |
Line 2325 width0pt\relax} \fi |
|
Line 2657 width0pt\relax} \fi |
|
\def\ifclearfail{\nestedignore{ifclear}} |
\def\ifclearfail{\nestedignore{ifclear}} |
\defineunmatchedend{ifclear} |
\defineunmatchedend{ifclear} |
|
|
% @iftex, @ifnothtml, @ifnotinfo always succeed; we read the text |
% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we |
% following, through the first @end iftex (etc.). Make `@end iftex' |
% read the text following, through the first @end iftex (etc.). Make |
% (etc.) valid only after an @iftex. |
% `@end iftex' (etc.) valid only after an @iftex. |
% |
% |
\def\iftex{\conditionalsucceed{iftex}} |
\def\iftex{\conditionalsucceed{iftex}} |
\def\ifnothtml{\conditionalsucceed{ifnothtml}} |
\def\ifnothtml{\conditionalsucceed{ifnothtml}} |
\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} |
\def\ifnotinfo{\conditionalsucceed{ifnotinfo}} |
|
\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}} |
\defineunmatchedend{iftex} |
\defineunmatchedend{iftex} |
\defineunmatchedend{ifnothtml} |
\defineunmatchedend{ifnothtml} |
\defineunmatchedend{ifnotinfo} |
\defineunmatchedend{ifnotinfo} |
|
\defineunmatchedend{ifnotplaintext} |
|
|
% We can't just want to start a group at @iftex (for example) and end it |
% We can't just want to start a group at @iftex (etc.) and end it at |
% at @end iftex, since then @set commands inside the conditional have no |
% @end iftex, since then @set commands inside the conditional have no |
% effect (they'd get reverted at the end of the group). So we must |
% effect (they'd get reverted at the end of the group). So we must |
% define \Eiftex to redefine itself to be its previous value. (We can't |
% define \Eiftex to redefine itself to be its previous value. (We can't |
% just define it to fail again with an ``unmatched end'' error, since |
% just define it to fail again with an ``unmatched end'' error, since |
Line 2389 width0pt\relax} \fi |
|
Line 2723 width0pt\relax} \fi |
|
} |
} |
|
|
% @defindex foo == \newindex{foo} |
% @defindex foo == \newindex{foo} |
|
% |
\def\defindex{\parsearg\newindex} |
\def\defindex{\parsearg\newindex} |
|
|
% Define @defcodeindex, like @defindex except put all entries in @code. |
% Define @defcodeindex, like @defindex except put all entries in @code. |
|
% |
|
\def\defcodeindex{\parsearg\newcodeindex} |
|
% |
\def\newcodeindex#1{% |
\def\newcodeindex#1{% |
\iflinks |
\iflinks |
\expandafter\newwrite \csname#1indfile\endcsname |
\expandafter\newwrite \csname#1indfile\endcsname |
\openout \csname#1indfile\endcsname \jobname.#1 |
\openout \csname#1indfile\endcsname \jobname.#1 |
\fi |
\fi |
\expandafter\xdef\csname#1index\endcsname{% |
\expandafter\xdef\csname#1index\endcsname{% |
\noexpand\docodeindex{#1}} |
\noexpand\docodeindex{#1}}% |
} |
} |
|
|
\def\defcodeindex{\parsearg\newcodeindex} |
|
|
|
% @synindex foo bar makes index foo feed into index bar. |
% @synindex foo bar makes index foo feed into index bar. |
% Do this instead of @defindex foo if you don't want it as a separate index. |
% Do this instead of @defindex foo if you don't want it as a separate index. |
% The \closeout helps reduce unnecessary open files; the limit on the |
% |
% Acorn RISC OS is a mere 16 files. |
|
\def\synindex#1 #2 {% |
|
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname |
|
\expandafter\closeout\csname#1indfile\endcsname |
|
\expandafter\let\csname#1indfile\endcsname=\synindexfoo |
|
\expandafter\xdef\csname#1index\endcsname{% define \xxxindex |
|
\noexpand\doindex{#2}}% |
|
} |
|
|
|
% @syncodeindex foo bar similar, but put all entries made for index foo |
% @syncodeindex foo bar similar, but put all entries made for index foo |
% inside @code. |
% inside @code. |
\def\syncodeindex#1 #2 {% |
% |
\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname |
\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} |
\expandafter\closeout\csname#1indfile\endcsname |
\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} |
\expandafter\let\csname#1indfile\endcsname=\synindexfoo |
|
\expandafter\xdef\csname#1index\endcsname{% define \xxxindex |
% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), |
\noexpand\docodeindex{#2}}% |
% #3 the target index (bar). |
|
\def\dosynindex#1#2#3{% |
|
% Only do \closeout if we haven't already done it, else we'll end up |
|
% closing the target index. |
|
\expandafter \ifx\csname donesynindex#2\endcsname \undefined |
|
% The \closeout helps reduce unnecessary open files; the limit on the |
|
% Acorn RISC OS is a mere 16 files. |
|
\expandafter\closeout\csname#2indfile\endcsname |
|
\expandafter\let\csname\donesynindex#2\endcsname = 1 |
|
\fi |
|
% redefine \fooindfile: |
|
\expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname |
|
\expandafter\let\csname#2indfile\endcsname=\temp |
|
% redefine \fooindex: |
|
\expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% |
} |
} |
|
|
% Define \doindex, the driver for all \fooindex macros. |
% Define \doindex, the driver for all \fooindex macros. |
Line 2444 width0pt\relax} \fi |
|
Line 2784 width0pt\relax} \fi |
|
\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} |
\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} |
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} |
\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} |
|
|
|
% Take care of texinfo commands likely to appear in an index entry. |
|
% (Must be a way to avoid doing expansion at all, and thus not have to |
|
% laboriously list every single command here.) |
|
% |
\def\indexdummies{% |
\def\indexdummies{% |
\def\ { }% |
\def\ { }% |
|
\def\@{@}% change to @@ when we switch to @ as escape char in aux files. |
|
% Need these in case \tex is in effect and \{ is a \delimiter again. |
|
% But can't use \lbracecmd and \rbracecmd because texindex assumes |
|
% braces and backslashes are used only as delimiters. |
|
\let\{ = \mylbrace |
|
\let\} = \myrbrace |
|
\def\_{{\realbackslash _}}% |
|
\normalturnoffactive |
|
% |
% Take care of the plain tex accent commands. |
% Take care of the plain tex accent commands. |
|
\def\,##1{\realbackslash ,{##1}}% |
\def\"{\realbackslash "}% |
\def\"{\realbackslash "}% |
\def\`{\realbackslash `}% |
\def\`{\realbackslash `}% |
\def\'{\realbackslash '}% |
\def\'{\realbackslash '}% |
Line 2459 width0pt\relax} \fi |
|
Line 2813 width0pt\relax} \fi |
|
\def\u{\realbackslash u}% |
\def\u{\realbackslash u}% |
\def\v{\realbackslash v}% |
\def\v{\realbackslash v}% |
\def\H{\realbackslash H}% |
\def\H{\realbackslash H}% |
|
\def\dotless##1{\realbackslash dotless {##1}}% |
% Take care of the plain tex special European modified letters. |
% Take care of the plain tex special European modified letters. |
\def\oe{\realbackslash oe}% |
|
\def\ae{\realbackslash ae}% |
|
\def\aa{\realbackslash aa}% |
|
\def\OE{\realbackslash OE}% |
|
\def\AE{\realbackslash AE}% |
|
\def\AA{\realbackslash AA}% |
\def\AA{\realbackslash AA}% |
\def\o{\realbackslash o}% |
\def\AE{\realbackslash AE}% |
|
\def\L{\realbackslash L}% |
|
\def\OE{\realbackslash OE}% |
\def\O{\realbackslash O}% |
\def\O{\realbackslash O}% |
|
\def\aa{\realbackslash aa}% |
|
\def\ae{\realbackslash ae}% |
\def\l{\realbackslash l}% |
\def\l{\realbackslash l}% |
\def\L{\realbackslash L}% |
\def\oe{\realbackslash oe}% |
|
\def\o{\realbackslash o}% |
\def\ss{\realbackslash ss}% |
\def\ss{\realbackslash ss}% |
% Take care of texinfo commands likely to appear in an index entry. |
% |
% (Must be a way to avoid doing expansion at all, and thus not have to |
% Although these internals commands shouldn't show up, sometimes they do. |
% laboriously list every single command here.) |
|
\def\@{@}% will be @@ when we switch to @ as escape char. |
|
% Need these in case \tex is in effect and \{ is a \delimiter again. |
|
% But can't use \lbracecmd and \rbracecmd because texindex assumes |
|
% braces and backslashes are used only as delimiters. |
|
\let\{ = \mylbrace |
|
\let\} = \myrbrace |
|
\def\_{{\realbackslash _}}% |
|
\def\w{\realbackslash w }% |
|
\def\bf{\realbackslash bf }% |
\def\bf{\realbackslash bf }% |
|
\def\gtr{\realbackslash gtr}% |
|
\def\hat{\realbackslash hat}% |
|
\def\less{\realbackslash less}% |
%\def\rm{\realbackslash rm }% |
%\def\rm{\realbackslash rm }% |
\def\sl{\realbackslash sl }% |
|
\def\sf{\realbackslash sf}% |
\def\sf{\realbackslash sf}% |
|
\def\sl{\realbackslash sl }% |
|
\def\tclose##1{\realbackslash tclose {##1}}% |
\def\tt{\realbackslash tt}% |
\def\tt{\realbackslash tt}% |
\def\gtr{\realbackslash gtr}% |
% |
\def\less{\realbackslash less}% |
\def\b##1{\realbackslash b {##1}}% |
\def\hat{\realbackslash hat}% |
\def\i##1{\realbackslash i {##1}}% |
|
\def\sc##1{\realbackslash sc {##1}}% |
|
\def\t##1{\realbackslash t {##1}}% |
|
\def\r##1{\realbackslash r {##1}}% |
|
% |
\def\TeX{\realbackslash TeX}% |
\def\TeX{\realbackslash TeX}% |
\def\dots{\realbackslash dots }% |
\def\acronym##1{\realbackslash acronym {##1}}% |
\def\result{\realbackslash result}% |
\def\cite##1{\realbackslash cite {##1}}% |
\def\equiv{\realbackslash equiv}% |
|
\def\expansion{\realbackslash expansion}% |
|
\def\print{\realbackslash print}% |
|
\def\error{\realbackslash error}% |
|
\def\point{\realbackslash point}% |
|
\def\copyright{\realbackslash copyright}% |
|
\def\tclose##1{\realbackslash tclose {##1}}% |
|
\def\code##1{\realbackslash code {##1}}% |
\def\code##1{\realbackslash code {##1}}% |
\def\uref##1{\realbackslash uref {##1}}% |
|
\def\url##1{\realbackslash url {##1}}% |
|
\def\env##1{\realbackslash env {##1}}% |
|
\def\command##1{\realbackslash command {##1}}% |
\def\command##1{\realbackslash command {##1}}% |
|
\def\dfn##1{\realbackslash dfn {##1}}% |
|
\def\dots{\realbackslash dots }% |
|
\def\emph##1{\realbackslash emph {##1}}% |
|
\def\env##1{\realbackslash env {##1}}% |
|
\def\file##1{\realbackslash file {##1}}% |
|
\def\kbd##1{\realbackslash kbd {##1}}% |
|
\def\key##1{\realbackslash key {##1}}% |
|
\def\math##1{\realbackslash math {##1}}% |
\def\option##1{\realbackslash option {##1}}% |
\def\option##1{\realbackslash option {##1}}% |
\def\dotless##1{\realbackslash dotless {##1}}% |
|
\def\samp##1{\realbackslash samp {##1}}% |
\def\samp##1{\realbackslash samp {##1}}% |
\def\,##1{\realbackslash ,{##1}}% |
\def\strong##1{\realbackslash strong {##1}}% |
\def\t##1{\realbackslash t {##1}}% |
\def\uref##1{\realbackslash uref {##1}}% |
\def\r##1{\realbackslash r {##1}}% |
\def\url##1{\realbackslash url {##1}}% |
\def\i##1{\realbackslash i {##1}}% |
|
\def\b##1{\realbackslash b {##1}}% |
|
\def\sc##1{\realbackslash sc {##1}}% |
|
\def\cite##1{\realbackslash cite {##1}}% |
|
\def\key##1{\realbackslash key {##1}}% |
|
\def\file##1{\realbackslash file {##1}}% |
|
\def\var##1{\realbackslash var {##1}}% |
\def\var##1{\realbackslash var {##1}}% |
\def\kbd##1{\realbackslash kbd {##1}}% |
\def\w{\realbackslash w }% |
\def\dfn##1{\realbackslash dfn {##1}}% |
|
\def\emph##1{\realbackslash emph {##1}}% |
|
\def\acronym##1{\realbackslash acronym {##1}}% |
|
% |
% |
|
% These math commands don't seem likely to be used in index entries. |
|
\def\copyright{\realbackslash copyright}% |
|
\def\equiv{\realbackslash equiv}% |
|
\def\error{\realbackslash error}% |
|
\def\expansion{\realbackslash expansion}% |
|
\def\point{\realbackslash point}% |
|
\def\print{\realbackslash print}% |
|
\def\result{\realbackslash result}% |
|
% |
% Handle some cases of @value -- where the variable name does not |
% Handle some cases of @value -- where the variable name does not |
% contain - or _, and the value does not contain any |
% contain - or _, and the value does not contain any |
% (non-fully-expandable) commands. |
% (non-fully-expandable) commands. |
Line 2535 width0pt\relax} \fi |
|
Line 2886 width0pt\relax} \fi |
|
|
|
% If an index command is used in an @example environment, any spaces |
% If an index command is used in an @example environment, any spaces |
% therein should become regular spaces in the raw index file, not the |
% therein should become regular spaces in the raw index file, not the |
% expansion of \tie (\\leavevmode \penalty \@M \ ). |
% expansion of \tie (\leavevmode \penalty \@M \ ). |
{\obeyspaces |
{\obeyspaces |
\gdef\unsepspaces{\obeyspaces\let =\space}} |
\gdef\unsepspaces{\obeyspaces\let =\space}} |
|
|
Line 2546 width0pt\relax} \fi |
|
Line 2897 width0pt\relax} \fi |
|
\def\indexdummydots{...} |
\def\indexdummydots{...} |
|
|
\def\indexnofonts{% |
\def\indexnofonts{% |
% Just ignore accents. |
\def\@{@}% |
|
% how to handle braces? |
|
\def\_{\normalunderscore}% |
|
% |
\let\,=\indexdummyfont |
\let\,=\indexdummyfont |
\let\"=\indexdummyfont |
\let\"=\indexdummyfont |
\let\`=\indexdummyfont |
\let\`=\indexdummyfont |
Line 2562 width0pt\relax} \fi |
|
Line 2916 width0pt\relax} \fi |
|
\let\H=\indexdummyfont |
\let\H=\indexdummyfont |
\let\dotless=\indexdummyfont |
\let\dotless=\indexdummyfont |
% Take care of the plain tex special European modified letters. |
% Take care of the plain tex special European modified letters. |
\def\oe{oe}% |
|
\def\ae{ae}% |
|
\def\aa{aa}% |
|
\def\OE{OE}% |
|
\def\AE{AE}% |
|
\def\AA{AA}% |
\def\AA{AA}% |
\def\o{o}% |
\def\AE{AE}% |
|
\def\L{L}% |
|
\def\OE{OE}% |
\def\O{O}% |
\def\O{O}% |
|
\def\aa{aa}% |
|
\def\ae{ae}% |
\def\l{l}% |
\def\l{l}% |
\def\L{L}% |
\def\oe{oe}% |
|
\def\o{o}% |
\def\ss{ss}% |
\def\ss{ss}% |
\let\w=\indexdummyfont |
% |
\let\t=\indexdummyfont |
% Don't no-op \tt, since it isn't a user-level command |
\let\r=\indexdummyfont |
% and is used in the definitions of the active chars like <, >, |, etc. |
\let\i=\indexdummyfont |
% Likewise with the other plain tex font commands. |
|
%\let\tt=\indexdummyfont |
|
% |
\let\b=\indexdummyfont |
\let\b=\indexdummyfont |
\let\emph=\indexdummyfont |
\let\i=\indexdummyfont |
\let\strong=\indexdummyfont |
\let\r=\indexdummyfont |
\let\cite=\indexdummyfont |
|
\let\sc=\indexdummyfont |
\let\sc=\indexdummyfont |
%Don't no-op \tt, since it isn't a user-level command |
\let\t=\indexdummyfont |
% and is used in the definitions of the active chars like <, >, |... |
% |
%\let\tt=\indexdummyfont |
\let\TeX=\indexdummytex |
\let\tclose=\indexdummyfont |
\let\acronym=\indexdummyfont |
|
\let\cite=\indexdummyfont |
\let\code=\indexdummyfont |
\let\code=\indexdummyfont |
\let\url=\indexdummyfont |
|
\let\uref=\indexdummyfont |
|
\let\env=\indexdummyfont |
|
\let\command=\indexdummyfont |
\let\command=\indexdummyfont |
\let\option=\indexdummyfont |
\let\dfn=\indexdummyfont |
|
\let\dots=\indexdummydots |
|
\let\emph=\indexdummyfont |
|
\let\env=\indexdummyfont |
\let\file=\indexdummyfont |
\let\file=\indexdummyfont |
\let\samp=\indexdummyfont |
|
\let\kbd=\indexdummyfont |
\let\kbd=\indexdummyfont |
\let\key=\indexdummyfont |
\let\key=\indexdummyfont |
|
\let\math=\indexdummyfont |
|
\let\option=\indexdummyfont |
|
\let\samp=\indexdummyfont |
|
\let\strong=\indexdummyfont |
|
\let\uref=\indexdummyfont |
|
\let\url=\indexdummyfont |
\let\var=\indexdummyfont |
\let\var=\indexdummyfont |
\let\TeX=\indexdummytex |
\let\w=\indexdummyfont |
\let\dots=\indexdummydots |
|
\def\@{@}% |
|
} |
} |
|
|
% To define \realbackslash, we must make \ not be an escape. |
% To define \realbackslash, we must make \ not be an escape. |
Line 2655 width0pt\relax} \fi |
|
Line 3014 width0pt\relax} \fi |
|
% Now the real index entry with the fonts. |
% Now the real index entry with the fonts. |
\toks0 = {#2}% |
\toks0 = {#2}% |
% |
% |
% If third (subentry) arg is present, add it to the index |
% If the third (subentry) arg is present, add it to the index |
% string. And include a space. |
% line to write. |
\ifx\thirdarg\emptymacro \else |
\ifx\thirdarg\emptymacro \else |
\toks0 = \expandafter{\the\toks0 \space #3}% |
\toks0 = \expandafter{\the\toks0{#3}}% |
\fi |
\fi |
% |
% |
% Set up the complete index entry, with both the sort key |
% Set up the complete index entry, with both the sort key and |
% and the original text, including any font commands. We write |
% the original text, including any font commands. We write |
% three arguments to \entry to the .?? file, texindex reduces to |
% three arguments to \entry to the .?? file (four in the |
% two when writing the .??s sorted result. |
% subentry case), texindex reduces to two when writing the .??s |
|
% sorted result. |
\edef\temp{% |
\edef\temp{% |
\write\csname#1indfile\endcsname{% |
\write\csname#1indfile\endcsname{% |
\realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% |
\realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% |
Line 2743 width0pt\relax} \fi |
|
Line 3103 width0pt\relax} \fi |
|
\def\doprintindex#1{\begingroup |
\def\doprintindex#1{\begingroup |
\dobreak \chapheadingskip{10000}% |
\dobreak \chapheadingskip{10000}% |
% |
% |
\indexfonts \rm |
\smallfonts \rm |
\tolerance = 9500 |
\tolerance = 9500 |
\indexbreaks |
\indexbreaks |
% |
% |
Line 2870 width0pt\relax} \fi |
|
Line 3230 width0pt\relax} \fi |
|
% The `\ ' here is removed by the implicit \unskip that TeX does as |
% The `\ ' here is removed by the implicit \unskip that TeX does as |
% part of (the primitive) \par. Without it, a spurious underfull |
% part of (the primitive) \par. Without it, a spurious underfull |
% \hbox ensues. |
% \hbox ensues. |
\ #2% The page number ends the paragraph. |
\ifpdf |
|
\pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. |
|
\else |
|
\ #2% The page number ends the paragraph. |
|
\fi |
\fi% |
\fi% |
\par |
\par |
\endgroup} |
\endgroup} |
Line 2882 width0pt\relax} \fi |
|
Line 3246 width0pt\relax} \fi |
|
\def\primary #1{\line{#1\hfil}} |
\def\primary #1{\line{#1\hfil}} |
|
|
\newskip\secondaryindent \secondaryindent=0.5cm |
\newskip\secondaryindent \secondaryindent=0.5cm |
|
\def\secondary#1#2{{% |
\def\secondary #1#2{ |
\parfillskip=0in |
{\parfillskip=0in \parskip=0in |
\parskip=0in |
\hangindent =1in \hangafter=1 |
\hangindent=1in |
\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par |
\hangafter=1 |
|
\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill |
|
\ifpdf |
|
\pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. |
|
\else |
|
#2 |
|
\fi |
|
\par |
}} |
}} |
|
|
% Define two-column mode, which we use to typeset indexes. |
% Define two-column mode, which we use to typeset indexes. |
Line 2946 width0pt\relax} \fi |
|
Line 3317 width0pt\relax} \fi |
|
% |
% |
% Double the \vsize as well. (We don't need a separate register here, |
% Double the \vsize as well. (We don't need a separate register here, |
% since nobody clobbers \vsize.) |
% since nobody clobbers \vsize.) |
\advance\vsize by -\ht\partialpage |
|
\vsize = 2\vsize |
\vsize = 2\vsize |
} |
} |
|
|
Line 2960 width0pt\relax} \fi |
|
Line 3330 width0pt\relax} \fi |
|
% previous page. |
% previous page. |
\dimen@ = \vsize |
\dimen@ = \vsize |
\divide\dimen@ by 2 |
\divide\dimen@ by 2 |
|
\advance\dimen@ by -\ht\partialpage |
% |
% |
% box0 will be the left-hand column, box2 the right. |
% box0 will be the left-hand column, box2 the right. |
\setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ |
\setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ |
Line 2967 width0pt\relax} \fi |
|
Line 3338 width0pt\relax} \fi |
|
\unvbox255 |
\unvbox255 |
\penalty\outputpenalty |
\penalty\outputpenalty |
} |
} |
|
% |
|
% Re-output the contents of the output page -- any previous material, |
|
% followed by the two boxes we just split, in box0 and box2. |
\def\pagesofar{% |
\def\pagesofar{% |
% Re-output the contents of the output page -- any previous material, |
|
% followed by the two boxes we just split, in box0 and box2. |
|
\unvbox\partialpage |
\unvbox\partialpage |
% |
% |
\hsize = \doublecolumnhsize |
\hsize = \doublecolumnhsize |
\wd0=\hsize \wd2=\hsize |
\wd0=\hsize \wd2=\hsize |
\hbox to\pagewidth{\box0\hfil\box2}% |
\hbox to\pagewidth{\box0\hfil\box2}% |
} |
} |
|
% |
|
% All done with double columns. |
\def\enddoublecolumns{% |
\def\enddoublecolumns{% |
\output = {% |
\output = {% |
% Split the last of the double-column material. Leave it on the |
% Split the last of the double-column material. Leave it on the |
Line 3000 width0pt\relax} \fi |
|
Line 3374 width0pt\relax} \fi |
|
% \endgroup where \vsize got restored). |
% \endgroup where \vsize got restored). |
\pagegoal = \vsize |
\pagegoal = \vsize |
} |
} |
|
% |
|
% Called at the end of the double column material. |
\def\balancecolumns{% |
\def\balancecolumns{% |
% Called at the end of the double column material. |
|
\setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. |
\setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. |
\dimen@ = \ht0 |
\dimen@ = \ht0 |
\advance\dimen@ by \topskip |
\advance\dimen@ by \topskip |
Line 3029 width0pt\relax} \fi |
|
Line 3404 width0pt\relax} \fi |
|
|
|
|
|
\message{sectioning,} |
\message{sectioning,} |
% Define chapters, sections, etc. |
% Chapters, sections, etc. |
|
|
\newcount\chapno |
\newcount\chapno |
\newcount\secno \secno=0 |
\newcount\secno \secno=0 |
Line 3038 width0pt\relax} \fi |
|
Line 3413 width0pt\relax} \fi |
|
|
|
% This counter is funny since it counts through charcodes of letters A, B, ... |
% This counter is funny since it counts through charcodes of letters A, B, ... |
\newcount\appendixno \appendixno = `\@ |
\newcount\appendixno \appendixno = `\@ |
\def\appendixletter{\char\appendixno} |
% \def\appendixletter{\char\the\appendixno} |
|
% We do the following for the sake of pdftex, which needs the actual |
|
% letter in the expansion, not just typeset. |
|
\def\appendixletter{% |
|
\ifnum\appendixno=`A A% |
|
\else\ifnum\appendixno=`B B% |
|
\else\ifnum\appendixno=`C C% |
|
\else\ifnum\appendixno=`D D% |
|
\else\ifnum\appendixno=`E E% |
|
\else\ifnum\appendixno=`F F% |
|
\else\ifnum\appendixno=`G G% |
|
\else\ifnum\appendixno=`H H% |
|
\else\ifnum\appendixno=`I I% |
|
\else\ifnum\appendixno=`J J% |
|
\else\ifnum\appendixno=`K K% |
|
\else\ifnum\appendixno=`L L% |
|
\else\ifnum\appendixno=`M M% |
|
\else\ifnum\appendixno=`N N% |
|
\else\ifnum\appendixno=`O O% |
|
\else\ifnum\appendixno=`P P% |
|
\else\ifnum\appendixno=`Q Q% |
|
\else\ifnum\appendixno=`R R% |
|
\else\ifnum\appendixno=`S S% |
|
\else\ifnum\appendixno=`T T% |
|
\else\ifnum\appendixno=`U U% |
|
\else\ifnum\appendixno=`V V% |
|
\else\ifnum\appendixno=`W W% |
|
\else\ifnum\appendixno=`X X% |
|
\else\ifnum\appendixno=`Y Y% |
|
\else\ifnum\appendixno=`Z Z% |
|
% The \the is necessary, despite appearances, because \appendixletter is |
|
% expanded while writing the .toc file. \char\appendixno is not |
|
% expandable, thus it is written literally, thus all appendixes come out |
|
% with the same letter (or @) in the toc without it. |
|
\else\char\the\appendixno |
|
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi |
|
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} |
|
|
% Each @chapter defines this as the name of the chapter. |
% Each @chapter defines this as the name of the chapter. |
% page headings and footings can use it. @section does likewise. |
% page headings and footings can use it. @section does likewise. |
Line 3149 width0pt\relax} \fi |
|
Line 3560 width0pt\relax} \fi |
|
\gdef\thischaptername{#1}% |
\gdef\thischaptername{#1}% |
\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% |
\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% |
\toks0 = {#1}% |
\toks0 = {#1}% |
\edef\temp{\noexpand\writetocentry{\realbackslash chapentry{\the\toks0}% |
\edef\temp{\noexpand\writetocentry{\realbackslash appendixentry{\the\toks0}% |
{\putwordAppendix{} \appendixletter}}}% |
{\appendixletter}}}% |
\temp |
\temp |
\appendixnoderef |
\appendixnoderef |
\global\let\section = \appendixsec |
\global\let\section = \appendixsec |
Line 3227 width0pt\relax} \fi |
|
Line 3638 width0pt\relax} \fi |
|
\def\unnumberedseczzz #1{% |
\def\unnumberedseczzz #1{% |
\plainsecheading {#1}\gdef\thissection{#1}% |
\plainsecheading {#1}\gdef\thissection{#1}% |
\toks0 = {#1}% |
\toks0 = {#1}% |
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry{\the\toks0}}}% |
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsecentry% |
|
{\the\toks0}{\the\chapno}}}% |
\temp |
\temp |
\unnumbnoderef |
\unnumbnoderef |
\nobreak |
\nobreak |
Line 3266 width0pt\relax} \fi |
|
Line 3678 width0pt\relax} \fi |
|
\plainsubsecheading {#1}\gdef\thissection{#1}% |
\plainsubsecheading {#1}\gdef\thissection{#1}% |
\toks0 = {#1}% |
\toks0 = {#1}% |
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry% |
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsecentry% |
{\the\toks0}}}% |
{\the\toks0}{\the\chapno}{\the\secno}}}% |
\temp |
\temp |
\unnumbnoderef |
\unnumbnoderef |
\nobreak |
\nobreak |
Line 3307 width0pt\relax} \fi |
|
Line 3719 width0pt\relax} \fi |
|
\plainsubsubsecheading {#1}\gdef\thissection{#1}% |
\plainsubsubsecheading {#1}\gdef\thissection{#1}% |
\toks0 = {#1}% |
\toks0 = {#1}% |
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry% |
\edef\temp{\noexpand\writetocentry{\realbackslash unnumbsubsubsecentry% |
{\the\toks0}}}% |
{\the\toks0}{\the\chapno}{\the\secno}{\the\subsecno}}}% |
\temp |
\temp |
\unnumbnoderef |
\unnumbnoderef |
\nobreak |
\nobreak |
Line 3511 width0pt\relax} \fi |
|
Line 3923 width0pt\relax} \fi |
|
|
|
|
|
\message{toc,} |
\message{toc,} |
|
% Table of contents. |
\newwrite\tocfile |
\newwrite\tocfile |
|
|
% Write an entry to the toc file, opening it if necessary. |
% Write an entry to the toc file, opening it if necessary. |
Line 3518 width0pt\relax} \fi |
|
Line 3931 width0pt\relax} \fi |
|
% argument, which will end up as the last argument to the \...entry macro. |
% argument, which will end up as the last argument to the \...entry macro. |
% |
% |
% We open the .toc file here instead of at @setfilename or any other |
% We open the .toc file here instead of at @setfilename or any other |
% given time so that @contents can be put in the document anywhere. |
% fixed time so that @contents can be put in the document anywhere. |
% |
% |
\newif\iftocfileopened |
\newif\iftocfileopened |
\def\writetocentry#1{% |
\def\writetocentry#1{% |
Line 3527 width0pt\relax} \fi |
|
Line 3940 width0pt\relax} \fi |
|
\global\tocfileopenedtrue |
\global\tocfileopenedtrue |
\fi |
\fi |
\iflinks \write\tocfile{#1{\folio}}\fi |
\iflinks \write\tocfile{#1{\folio}}\fi |
|
% |
|
% Tell \shipout to create a page destination if we're doing pdf, which |
|
% will be the target of the links in the table of contents. We can't |
|
% just do it on every page because the title pages are numbered 1 and |
|
% 2 (the page numbers aren't printed), and so are the first two pages |
|
% of the document. Thus, we'd have two destinations named `1', and |
|
% two named `2'. |
|
\ifpdf \pdfmakepagedesttrue \fi |
} |
} |
|
|
\newskip\contentsrightmargin \contentsrightmargin=1in |
\newskip\contentsrightmargin \contentsrightmargin=1in |
Line 3571 width0pt\relax} \fi |
|
Line 3992 width0pt\relax} \fi |
|
\fi |
\fi |
\vfill \eject |
\vfill \eject |
\contentsalignmacro % in case @setchapternewpage odd is in effect |
\contentsalignmacro % in case @setchapternewpage odd is in effect |
|
\pdfmakeoutlines |
\endgroup |
\endgroup |
\lastnegativepageno = \pageno |
\lastnegativepageno = \pageno |
\pageno = \savepageno |
\pageno = \savepageno |
Line 3581 width0pt\relax} \fi |
|
Line 4003 width0pt\relax} \fi |
|
\startcontents{\putwordShortTOC}% |
\startcontents{\putwordShortTOC}% |
% |
% |
\let\chapentry = \shortchapentry |
\let\chapentry = \shortchapentry |
|
\let\appendixentry = \shortappendixentry |
\let\unnumbchapentry = \shortunnumberedentry |
\let\unnumbchapentry = \shortunnumberedentry |
% We want a true roman here for the page numbers. |
% We want a true roman here for the page numbers. |
\secfonts |
\secfonts |
Line 3589 width0pt\relax} \fi |
|
Line 4012 width0pt\relax} \fi |
|
\hyphenpenalty = 10000 |
\hyphenpenalty = 10000 |
\advance\baselineskip by 1pt % Open it up a little. |
\advance\baselineskip by 1pt % Open it up a little. |
\def\secentry ##1##2##3##4{} |
\def\secentry ##1##2##3##4{} |
\def\unnumbsecentry ##1##2{} |
\def\unnumbsecentry ##1##2##3{} |
\def\subsecentry ##1##2##3##4##5{} |
\def\subsecentry ##1##2##3##4##5{} |
\def\unnumbsubsecentry ##1##2{} |
\def\unnumbsubsecentry ##1##2##3##4{} |
\def\subsubsecentry ##1##2##3##4##5##6{} |
\def\subsubsecentry ##1##2##3##4##5##6{} |
\def\unnumbsubsubsecentry ##1##2{} |
\def\unnumbsubsubsecentry ##1##2##3##4##5{} |
\openin 1 \jobname.toc |
\openin 1 \jobname.toc |
\ifeof 1 \else |
\ifeof 1 \else |
\closein 1 |
\closein 1 |
Line 3607 width0pt\relax} \fi |
|
Line 4030 width0pt\relax} \fi |
|
} |
} |
\let\shortcontents = \summarycontents |
\let\shortcontents = \summarycontents |
|
|
|
\ifpdf |
|
\pdfcatalog{/PageMode /UseOutlines}% |
|
\fi |
|
|
% These macros generate individual entries in the table of contents. |
% These macros generate individual entries in the table of contents. |
% The first argument is the chapter or section name. |
% The first argument is the chapter or section name. |
% The last argument is the page number. |
% The last argument is the page number. |
% The arguments in between are the chapter number, section number, ... |
% The arguments in between are the chapter number, section number, ... |
|
|
% Chapter-level things, for both the long and short contents. |
% Chapters, in the main contents. |
\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} |
\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} |
|
% |
% See comments in \dochapentry re vbox and related settings |
% Chapters, in the short toc. |
|
% See comments in \dochapentry re vbox and related settings. |
\def\shortchapentry#1#2#3{% |
\def\shortchapentry#1#2#3{% |
\tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% |
\tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}% |
} |
} |
|
|
|
% Appendices, in the main contents. |
|
\def\appendixentry#1#2#3{\dochapentry{\putwordAppendix{} #2\labelspace#1}{#3}} |
|
% |
|
% Appendices, in the short toc. |
|
\let\shortappendixentry = \shortchapentry |
|
|
% Typeset the label for a chapter or appendix for the short contents. |
% Typeset the label for a chapter or appendix for the short contents. |
% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. |
% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter. |
% We could simplify the code here by writing out an \appendixentry |
% We could simplify the code here by writing out an \appendixentry |
% command in the toc file for appendices, instead of using \chapentry |
% command in the toc file for appendices, instead of using \chapentry |
% for both, but it doesn't seem worth it. |
% for both, but it doesn't seem worth it. |
\setbox0 = \hbox{\shortcontrm \putwordAppendix } |
% |
\newdimen\shortappendixwidth \shortappendixwidth = \wd0 |
\newdimen\shortappendixwidth |
|
% |
\def\shortchaplabel#1{% |
\def\shortchaplabel#1{% |
% We typeset #1 in a box of constant width, regardless of the text of |
% This space should be enough, since a single number is .5em, and the |
% #1, so the chapter titles will come out aligned. |
|
\setbox0 = \hbox{#1}% |
|
\dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi |
|
% |
|
% This space should be plenty, since a single number is .5em, and the |
|
% widest letter (M) is 1em, at least in the Computer Modern fonts. |
% widest letter (M) is 1em, at least in the Computer Modern fonts. |
|
% But use \hss just in case. |
% (This space doesn't include the extra space that gets added after |
% (This space doesn't include the extra space that gets added after |
% the label; that gets put in by \shortchapentry above.) |
% the label; that gets put in by \shortchapentry above.) |
\advance\dimen0 by 1.1em |
\dimen0 = 1em |
\hbox to \dimen0{#1\hfil}% |
\hbox to \dimen0{#1\hss}% |
} |
} |
|
|
|
% Unnumbered chapters. |
\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} |
\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} |
\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} |
\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno\bgroup#2\egroup}} |
|
|
% Sections. |
% Sections. |
\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} |
\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} |
\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} |
\def\unnumbsecentry#1#2#3{\dosecentry{#1}{#3}} |
|
|
% Subsections. |
% Subsections. |
\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} |
\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} |
\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} |
\def\unnumbsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} |
|
|
% And subsubsections. |
% And subsubsections. |
\def\subsubsecentry#1#2#3#4#5#6{% |
\def\subsubsecentry#1#2#3#4#5#6{% |
\dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} |
\dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} |
\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} |
\def\unnumbsubsubsecentry#1#2#3#4#5{\dosubsubsecentry{#1}{#5}} |
|
|
% This parameter controls the indentation of the various levels. |
% This parameter controls the indentation of the various levels. |
\newdimen\tocindent \tocindent = 3pc |
\newdimen\tocindent \tocindent = 3pc |
Line 3670 width0pt\relax} \fi |
|
Line 4101 width0pt\relax} \fi |
|
\penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip |
\penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip |
\begingroup |
\begingroup |
\chapentryfonts |
\chapentryfonts |
\tocentry{#1}{\dopageno{#2}}% |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\endgroup |
\endgroup |
\nobreak\vskip .25\baselineskip plus.1\baselineskip |
\nobreak\vskip .25\baselineskip plus.1\baselineskip |
} |
} |
|
|
\def\dosecentry#1#2{\begingroup |
\def\dosecentry#1#2{\begingroup |
\secentryfonts \leftskip=\tocindent |
\secentryfonts \leftskip=\tocindent |
\tocentry{#1}{\dopageno{#2}}% |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\endgroup} |
\endgroup} |
|
|
\def\dosubsecentry#1#2{\begingroup |
\def\dosubsecentry#1#2{\begingroup |
\subsecentryfonts \leftskip=2\tocindent |
\subsecentryfonts \leftskip=2\tocindent |
\tocentry{#1}{\dopageno{#2}}% |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\endgroup} |
\endgroup} |
|
|
\def\dosubsubsecentry#1#2{\begingroup |
\def\dosubsubsecentry#1#2{\begingroup |
\subsubsecentryfonts \leftskip=3\tocindent |
\subsubsecentryfonts \leftskip=3\tocindent |
\tocentry{#1}{\dopageno{#2}}% |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\endgroup} |
\endgroup} |
|
|
% Final typesetting of a toc entry; we use the same \entry macro as for |
% Final typesetting of a toc entry; we use the same \entry macro as for |
Line 3697 width0pt\relax} \fi |
|
Line 4128 width0pt\relax} \fi |
|
\def\tocentry#1#2{\begingroup |
\def\tocentry#1#2{\begingroup |
\vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks |
\vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks |
% Do not use \turnoffactive in these arguments. Since the toc is |
% Do not use \turnoffactive in these arguments. Since the toc is |
% typeset in cmr, so characters such as _ would come out wrong; we |
% typeset in cmr, characters such as _ would come out wrong; we |
% have to do the usual translation tricks. |
% have to do the usual translation tricks. |
\entry{#1}{#2}% |
\entry{#1}{#2}% |
\endgroup} |
\endgroup} |
Line 3715 width0pt\relax} \fi |
|
Line 4146 width0pt\relax} \fi |
|
|
|
|
|
\message{environments,} |
\message{environments,} |
|
% @foo ... @end foo. |
|
|
|
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. |
|
% |
% Since these characters are used in examples, it should be an even number of |
% Since these characters are used in examples, it should be an even number of |
% \tt widths. Each \tt character is 1en, so two makes it 1em. |
% \tt widths. Each \tt character is 1en, so two makes it 1em. |
% Furthermore, these definitions must come after we define our fonts. |
% |
\newbox\dblarrowbox \newbox\longdblarrowbox |
|
\newbox\pushcharbox \newbox\bullbox |
|
\newbox\equivbox \newbox\errorbox |
|
|
|
%{\tentt |
|
%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} |
|
%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} |
|
%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} |
|
%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} |
|
% Adapted from the manmac format (p.420 of TeXbook) |
|
%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex |
|
% depth .1ex\hfil} |
|
%} |
|
|
|
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. |
|
\def\point{$\star$} |
\def\point{$\star$} |
\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} |
\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} |
\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} |
\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} |
\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} |
\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} |
\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} |
\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} |
|
|
|
% The @error{} command. |
% Adapted from the TeXbook's \boxit. |
% Adapted from the TeXbook's \boxit. |
|
% |
|
\newbox\errorbox |
|
% |
{\tentt \global\dimen0 = 3em}% Width of the box. |
{\tentt \global\dimen0 = 3em}% Width of the box. |
\dimen2 = .55pt % Thickness of rules |
\dimen2 = .55pt % Thickness of rules |
% The text. (`r' is open on the right, `e' somewhat less so on the left.) |
% The text. (`r' is open on the right, `e' somewhat less so on the left.) |
\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} |
\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} |
|
% |
\global\setbox\errorbox=\hbox to \dimen0{\hfil |
\global\setbox\errorbox=\hbox to \dimen0{\hfil |
\hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. |
\hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. |
\advance\hsize by -2\dimen2 % Rules. |
\advance\hsize by -2\dimen2 % Rules. |
Line 3756 width0pt\relax} \fi |
|
Line 4179 width0pt\relax} \fi |
|
\kern3pt\vrule width\dimen2}% Space to right. |
\kern3pt\vrule width\dimen2}% Space to right. |
\hrule height\dimen2} |
\hrule height\dimen2} |
\hfil} |
\hfil} |
|
% |
% The @error{} command. |
|
\def\error{\leavevmode\lower.7ex\copy\errorbox} |
\def\error{\leavevmode\lower.7ex\copy\errorbox} |
|
|
% @tex ... @end tex escapes into raw Tex temporarily. |
% @tex ... @end tex escapes into raw Tex temporarily. |
Line 3797 width0pt\relax} \fi |
|
Line 4219 width0pt\relax} \fi |
|
\def\@{@}% |
\def\@{@}% |
\let\Etex=\endgroup} |
\let\Etex=\endgroup} |
|
|
% Define @lisp ... @endlisp. |
% Define @lisp ... @end lisp. |
% @lisp does a \begingroup so it can rebind things, |
% @lisp does a \begingroup so it can rebind things, |
% including the definition of @endlisp (which normally is erroneous). |
% including the definition of @end lisp (which normally is erroneous). |
|
|
% Amount to narrow the margins by for @lisp. |
% Amount to narrow the margins by for @lisp. |
\newskip\lispnarrowing \lispnarrowing=0.4in |
\newskip\lispnarrowing \lispnarrowing=0.4in |
Line 3830 width0pt\relax} \fi |
|
Line 4252 width0pt\relax} \fi |
|
% is reset to zero; thus the \afterenvbreak inserts no space -- but the |
% is reset to zero; thus the \afterenvbreak inserts no space -- but the |
% start of the next paragraph will insert \parskip |
% start of the next paragraph will insert \parskip |
% |
% |
\def\aboveenvbreak{{\advance\envskipamount by \parskip |
\def\aboveenvbreak{{% |
\endgraf \ifdim\lastskip<\envskipamount |
\ifnum\lastpenalty < 10000 |
\removelastskip \penalty-50 \vskip\envskipamount \fi}} |
\advance\envskipamount by \parskip |
|
\endgraf |
|
\ifdim\lastskip<\envskipamount |
|
\removelastskip |
|
\penalty-50 |
|
\vskip\envskipamount |
|
\fi |
|
\fi |
|
}} |
|
|
\let\afterenvbreak = \aboveenvbreak |
\let\afterenvbreak = \aboveenvbreak |
|
|
Line 3964 width0pt\relax} \fi |
|
Line 4394 width0pt\relax} \fi |
|
\def\smalllispx{\begingroup |
\def\smalllispx{\begingroup |
\def\Esmalllisp{\nonfillfinish\endgroup}% |
\def\Esmalllisp{\nonfillfinish\endgroup}% |
\def\Esmallexample{\nonfillfinish\endgroup}% |
\def\Esmallexample{\nonfillfinish\endgroup}% |
\indexfonts |
\smallexamplefonts |
\lisp |
\lisp |
} |
} |
|
|
Line 3975 width0pt\relax} \fi |
|
Line 4405 width0pt\relax} \fi |
|
\let\Edisplay = \nonfillfinish |
\let\Edisplay = \nonfillfinish |
\gobble |
\gobble |
} |
} |
|
% |
% @smalldisplay (when @smallbook): @display plus smaller fonts. |
% @smalldisplay (when @smallbook): @display plus smaller fonts. |
% |
% |
\def\smalldisplayx{\begingroup |
\def\smalldisplayx{\begingroup |
\def\Esmalldisplay{\nonfillfinish\endgroup}% |
\def\Esmalldisplay{\nonfillfinish\endgroup}% |
\indexfonts \rm |
\smallexamplefonts \rm |
\display |
\display |
} |
} |
|
|
Line 3992 width0pt\relax} \fi |
|
Line 4422 width0pt\relax} \fi |
|
\let\Eformat = \nonfillfinish |
\let\Eformat = \nonfillfinish |
\gobble |
\gobble |
} |
} |
|
% |
% @smallformat (when @smallbook): @format plus smaller fonts. |
% @smallformat (when @smallbook): @format plus smaller fonts. |
% |
% |
\def\smallformatx{\begingroup |
\def\smallformatx{\begingroup |
\def\Esmallformat{\nonfillfinish\endgroup}% |
\def\Esmallformat{\nonfillfinish\endgroup}% |
\indexfonts \rm |
\smallexamplefonts \rm |
\format |
\format |
} |
} |
|
|
Line 4015 width0pt\relax} \fi |
|
Line 4445 width0pt\relax} \fi |
|
\gobble |
\gobble |
} |
} |
|
|
|
|
% @quotation does normal linebreaking (hence we can't use \nonfillstart) |
% @quotation does normal linebreaking (hence we can't use \nonfillstart) |
% and narrows the margins. |
% and narrows the margins. |
% |
% |
Line 4037 width0pt\relax} \fi |
|
Line 4468 width0pt\relax} \fi |
|
} |
} |
|
|
|
|
|
% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>} |
|
% If we want to allow any <char> as delimiter, |
|
% we need the curly braces so that makeinfo sees the @verb command, eg: |
|
% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org |
|
% |
|
% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. |
|
% |
|
% [Knuth] p. 344; only we need to do '@' too |
|
\def\dospecials{% |
|
\do\ \do\\\do\@\do\{\do\}\do\$\do\&% |
|
\do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} |
|
% |
|
% [Knuth] p. 380 |
|
\def\uncatcodespecials{% |
|
\def\do##1{\catcode`##1=12}\dospecials} |
|
% |
|
% [Knuth] pp. 380,381,391 |
|
% Disable Spanish ligatures ?` and !` of \tt font |
|
\begingroup |
|
\catcode`\`=\active\gdef`{\relax\lq} |
|
\endgroup |
|
% |
|
% Setup for the @verb command. |
|
% |
|
% Eight spaces for a tab |
|
\begingroup |
|
\catcode`\^^I=\active |
|
\gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} |
|
\endgroup |
|
% |
|
\def\setupverb{% |
|
\tt % easiest (and conventionally used) font for verbatim |
|
\def\par{\leavevmode\endgraf}% |
|
\catcode`\`=\active |
|
\tabeightspaces |
|
% Respect line breaks, |
|
% print special symbols as themselves, and |
|
% make each space count |
|
% must do in this order: |
|
\obeylines \uncatcodespecials \sepspaces |
|
} |
|
|
|
% Setup for the @verbatim environment |
|
% |
|
% Real tab expansion |
|
\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount |
|
% |
|
\def\starttabbox{\setbox0=\hbox\bgroup} |
|
\begingroup |
|
\catcode`\^^I=\active |
|
\gdef\tabexpand{% |
|
\catcode`\^^I=\active |
|
\def^^I{\leavevmode\egroup |
|
\dimen0=\wd0 % the width so far, or since the previous tab |
|
\divide\dimen0 by\tabw |
|
\multiply\dimen0 by\tabw % compute previous multiple of \tabw |
|
\advance\dimen0 by\tabw % advance to next multiple of \tabw |
|
\wd0=\dimen0 \box0 \starttabbox |
|
}% |
|
} |
|
\endgroup |
|
\def\setupverbatim{% |
|
% Easiest (and conventionally used) font for verbatim |
|
\tt |
|
\def\par{\leavevmode\egroup\box0\endgraf}% |
|
\catcode`\`=\active |
|
\tabexpand |
|
% Respect line breaks, |
|
% print special symbols as themselves, and |
|
% make each space count |
|
% must do in this order: |
|
\obeylines \uncatcodespecials \sepspaces |
|
\everypar{\starttabbox}% |
|
} |
|
|
|
% Do the @verb magic: verbatim text is quoted by unique |
|
% delimiter characters. Before first delimiter expect a |
|
% right brace, after last delimiter expect closing brace: |
|
% |
|
% \def\doverb'{'<char>#1<char>'}'{#1} |
|
% |
|
% [Knuth] p. 382; only eat outer {} |
|
\begingroup |
|
\catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12 |
|
\gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] |
|
\endgroup |
|
% |
|
\def\verb{\begingroup\setupverb\doverb} |
|
% |
|
% |
|
% Do the @verbatim magic: define the macro \doverbatim so that |
|
% the (first) argument ends when '@end verbatim' is reached, ie: |
|
% |
|
% \def\doverbatim#1@end verbatim{#1} |
|
% |
|
% For Texinfo it's a lot easier than for LaTeX, |
|
% because texinfo's \verbatim doesn't stop at '\end{verbatim}': |
|
% we need not redefine '\', '{' and '}' |
|
% |
|
% Inspired by LaTeX's verbatim command set [latex.ltx] |
|
%% Include LaTeX hack for completeness -- never know |
|
%% \begingroup |
|
%% \catcode`|=0 \catcode`[=1 |
|
%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active |
|
%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[ |
|
%% #1|endgroup|def|Everbatim[]|end[verbatim]] |
|
%% |endgroup |
|
\begingroup |
|
\catcode`\ =\active |
|
\gdef\doverbatim#1@end verbatim{#1\end{verbatim}} |
|
\endgroup |
|
% |
|
\def\verbatim{% |
|
\def\Everbatim{\nonfillfinish\endgroup}% |
|
\begingroup |
|
\nonfillstart |
|
\advance\leftskip by -\defbodyindent |
|
\begingroup\setupverbatim\doverbatim |
|
} |
|
|
|
% @verbatiminclude FILE - insert text of file in verbatim environment. |
|
% |
|
% Allow normal characters that we make active in the argument (a file name). |
|
\def\verbatiminclude{% |
|
\begingroup |
|
\catcode`\\=12 |
|
\catcode`~=12 |
|
\catcode`^=12 |
|
\catcode`_=12 |
|
\catcode`|=12 |
|
\catcode`<=12 |
|
\catcode`>=12 |
|
\catcode`+=12 |
|
\parsearg\doverbatiminclude |
|
} |
|
\def\setupverbatiminclude{% |
|
\begingroup |
|
\nonfillstart |
|
\advance\leftskip by -\defbodyindent |
|
\begingroup\setupverbatim |
|
} |
|
% |
|
\def\doverbatiminclude#1{% |
|
% Restore active chars for included file. |
|
\endgroup |
|
\begingroup |
|
\def\thisfile{#1}% |
|
\expandafter\expandafter\setupverbatiminclude\input\thisfile |
|
\endgroup\nonfillfinish\endgroup |
|
} |
|
|
|
% @copying ... @end copying. |
|
% Save the text away for @insertcopying later. |
|
% |
|
\newbox\copyingbox |
|
% |
|
\def\copying{\begingroup |
|
\parindent = 0pt % looks wrong on title page |
|
\def\Ecopying{\egroup\endgroup}% |
|
\global\setbox\copyingbox = \vbox\bgroup |
|
} |
|
|
|
% @insertcopying. |
|
% |
|
\def\insertcopying{\unvcopy\copyingbox} |
|
|
|
|
\message{defuns,} |
\message{defuns,} |
% Define formatter for defuns |
% @defun etc. |
% First, allow user to change definition object font (\df) internally |
|
|
% Allow user to change definition object font (\df) internally |
\def\setdeffont #1 {\csname DEF#1\endcsname} |
\def\setdeffont #1 {\csname DEF#1\endcsname} |
|
|
\newskip\defbodyindent \defbodyindent=.4in |
\newskip\defbodyindent \defbodyindent=.4in |
Line 4166 width0pt\relax} \fi |
|
Line 4765 width0pt\relax} \fi |
|
\exdentamount=\defbodyindent |
\exdentamount=\defbodyindent |
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} |
\begingroup\obeylines\activeparens\spacesplit{#3{#4}}} |
|
|
% @deftypemethod has an extra argument that nothing else does. Sigh. |
% Used for @deftypemethod and @deftypeivar. |
% #1 is the \E... control sequence to end the definition (which we define). |
% #1 is the \E... control sequence to end the definition (which we define). |
% #2 is the \...x control sequence for consecutive fns (which we define). |
% #2 is the \...x control sequence for consecutive fns (which we define). |
% #3 is the control sequence to call to resume processing. |
% #3 is the control sequence to call to resume processing. |
% #4, delimited by the space, is the class name. |
% #4, delimited by a space, is the class name. |
% #5 is the method's return type. |
% #5 is the method's return type. |
% |
% |
\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV % |
\def\deftypemethparsebody#1#2#3#4 #5 {\begingroup\inENV |
\medbreak % |
\medbreak |
% Define the end token that this defining construct specifies |
\def#1{\endgraf\endgroup\medbreak}% |
% so that it will exit this group. |
\def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}% |
\def#1{\endgraf\endgroup\medbreak}% |
\parindent=0in |
\def#2##1 ##2 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}{##2}}}% |
\advance\leftskip by \defbodyindent |
\parindent=0in |
\exdentamount=\defbodyindent |
\advance\leftskip by \defbodyindent |
\begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}} |
\exdentamount=\defbodyindent |
|
\begingroup\obeylines\activeparens\spacesplit{#3{#4}{#5}}} |
|
|
|
|
% Used for @deftypeop. The change from \deftypemethparsebody is an |
|
% extra argument at the beginning which is the `category', instead of it |
|
% being the hardwired string `Method' or `Instance Variable'. We have |
|
% to account for this both in the \...x definition and in parsing the |
|
% input at hand. Thus also need a control sequence (passed as #5) for |
|
% the \E... definition to assign the category name to. |
|
% |
|
\def\deftypeopparsebody#1#2#3#4#5 #6 {\begingroup\inENV |
|
\medbreak |
|
\def#1{\endgraf\endgroup\medbreak}% |
|
\def#2##1 ##2 ##3 {% |
|
\def#4{##1}% |
|
\begingroup\obeylines\activeparens\spacesplit{#3{##2}{##3}}}% |
|
\parindent=0in |
|
\advance\leftskip by \defbodyindent |
|
\exdentamount=\defbodyindent |
|
\begingroup\obeylines\activeparens\spacesplit{#3{#5}{#6}}} |
|
|
\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % |
\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % |
\medbreak % |
\medbreak % |
% Define the end token that this defining construct specifies |
% Define the end token that this defining construct specifies |
Line 4293 width0pt\relax} \fi |
|
Line 4908 width0pt\relax} \fi |
|
% First, define the processing that is wanted for arguments of \defun |
% First, define the processing that is wanted for arguments of \defun |
% Use this to expand the args and terminate the paragraph they make up |
% Use this to expand the args and terminate the paragraph they make up |
|
|
\def\defunargs #1{\functionparens \sl |
\def\defunargs#1{\functionparens \sl |
% Expand, preventing hyphenation at `-' chars. |
% Expand, preventing hyphenation at `-' chars. |
% Note that groups don't affect changes in \hyphenchar. |
% Note that groups don't affect changes in \hyphenchar. |
\hyphenchar\tensl=0 |
% Set the font temporarily and use \font in case \setfont made \tensl a macro. |
|
{\tensl\hyphenchar\font=0}% |
#1% |
#1% |
\hyphenchar\tensl=45 |
{\tensl\hyphenchar\font=45}% |
\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% |
\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi% |
\interlinepenalty=10000 |
\interlinepenalty=10000 |
\advance\rightskip by 0pt plus 1fil |
\advance\rightskip by 0pt plus 1fil |
Line 4346 width0pt\relax} \fi |
|
Line 4962 width0pt\relax} \fi |
|
% #1 is the data type, #2 the name, #3 the args. |
% #1 is the data type, #2 the name, #3 the args. |
\def\deftypefunheaderx #1#2 #3\relax{% |
\def\deftypefunheaderx #1#2 #3\relax{% |
\doind {fn}{\code{#2}}% Make entry in function index |
\doind {fn}{\code{#2}}% Make entry in function index |
\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypefun}% |
\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}% |
\deftypefunargs {#3}\endgroup % |
\deftypefunargs {#3}\endgroup % |
\catcode 61=\other % Turn off change made in \defparsebody |
\catcode 61=\other % Turn off change made in \defparsebody |
} |
} |
Line 4355 width0pt\relax} \fi |
|
Line 4971 width0pt\relax} \fi |
|
|
|
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} |
\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} |
|
|
% \defheaderxcond#1\relax$$$ |
% \defheaderxcond#1\relax$.$ |
% puts #1 in @code, followed by a space, but does nothing if #1 is null. |
% puts #1 in @code, followed by a space, but does nothing if #1 is null. |
\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} |
\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi} |
|
|
% #1 is the classification. #2 is the data type. #3 is the name and args. |
% #1 is the classification. #2 is the data type. #3 is the name and args. |
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} |
\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} |
Line 4367 width0pt\relax} \fi |
|
Line 4983 width0pt\relax} \fi |
|
\begingroup |
\begingroup |
\normalparens % notably, turn off `&' magic, which prevents |
\normalparens % notably, turn off `&' magic, which prevents |
% at least some C++ text from working |
% at least some C++ text from working |
\defname {\defheaderxcond#2\relax$$$#3}{#1}% |
\defname {\defheaderxcond#2\relax$.$#3}{#1}% |
\deftypefunargs {#4}\endgroup % |
\deftypefunargs {#4}\endgroup % |
\catcode 61=\other % Turn off change made in \defparsebody |
\catcode 61=\other % Turn off change made in \defparsebody |
} |
} |
Line 4397 width0pt\relax} \fi |
|
Line 5013 width0pt\relax} \fi |
|
\def\defop #1 {\def\defoptype{#1}% |
\def\defop #1 {\def\defoptype{#1}% |
\defopparsebody\Edefop\defopx\defopheader\defoptype} |
\defopparsebody\Edefop\defopx\defopheader\defoptype} |
% |
% |
\def\defopheader #1#2#3{% |
\def\defopheader#1#2#3{% |
\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index |
\dosubind {fn}{\code{#2}}{\putwordon\ #1}% Make entry in function index |
\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}% |
\begingroup\defname {#2}{\defoptype\ \putwordon\ #1}% |
\defunargs {#3}\endgroup % |
\defunargs {#3}\endgroup % |
} |
} |
|
|
% @deftypemethod CLASS RETURN-TYPE METHOD ARG... |
% @deftypeop CATEGORY CLASS TYPE OPERATION ARG... |
% |
% |
|
\def\deftypeop #1 {\def\deftypeopcategory{#1}% |
|
\deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader |
|
\deftypeopcategory} |
|
% |
|
% #1 is the class name, #2 the data type, #3 the operation name, #4 the args. |
|
\def\deftypeopheader#1#2#3#4{% |
|
\dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index |
|
\begingroup |
|
\defname{\defheaderxcond#2\relax$.$#3} |
|
{\deftypeopcategory\ \putwordon\ \code{#1}}% |
|
\deftypefunargs{#4}% |
|
\endgroup |
|
} |
|
|
|
% @deftypemethod CLASS TYPE METHOD ARG... |
|
% |
\def\deftypemethod{% |
\def\deftypemethod{% |
\deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} |
\deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader} |
% |
% |
Line 4412 width0pt\relax} \fi |
|
Line 5044 width0pt\relax} \fi |
|
\def\deftypemethodheader#1#2#3#4{% |
\def\deftypemethodheader#1#2#3#4{% |
\dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index |
\dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index |
\begingroup |
\begingroup |
\defname{\defheaderxcond#2\relax$$$#3}{\putwordMethodon\ \code{#1}}% |
\defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}% |
\deftypefunargs{#4}% |
\deftypefunargs{#4}% |
\endgroup |
\endgroup |
} |
} |
Line 4426 width0pt\relax} \fi |
|
Line 5058 width0pt\relax} \fi |
|
\def\deftypeivarheader#1#2#3{% |
\def\deftypeivarheader#1#2#3{% |
\dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index |
\dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index |
\begingroup |
\begingroup |
\defname{#3}{\putwordInstanceVariableof\ \code{#1}}% |
\defname{\defheaderxcond#2\relax$.$#3} |
|
{\putwordInstanceVariableof\ \code{#1}}% |
\defvarargs{#3}% |
\defvarargs{#3}% |
\endgroup |
\endgroup |
} |
} |
Line 4508 width0pt\relax} \fi |
|
Line 5141 width0pt\relax} \fi |
|
% is actually part of the data type, which should not be put into the index. |
% is actually part of the data type, which should not be put into the index. |
\def\deftypevarheader #1#2{% |
\def\deftypevarheader #1#2{% |
\dovarind#2 \relax% Make entry in variables index |
\dovarind#2 \relax% Make entry in variables index |
\begingroup\defname {\defheaderxcond#1\relax$$$#2}{\putwordDeftypevar}% |
\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}% |
\interlinepenalty=10000 |
\interlinepenalty=10000 |
\endgraf\nobreak\vskip -\parskip\nobreak |
\endgraf\nobreak\vskip -\parskip\nobreak |
\endgroup} |
\endgroup} |
Line 4519 width0pt\relax} \fi |
|
Line 5152 width0pt\relax} \fi |
|
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} |
\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} |
|
|
\def\deftypevrheader #1#2#3{\dovarind#3 \relax% |
\def\deftypevrheader #1#2#3{\dovarind#3 \relax% |
\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} |
\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1} |
\interlinepenalty=10000 |
\interlinepenalty=10000 |
\endgraf\nobreak\vskip -\parskip\nobreak |
\endgraf\nobreak\vskip -\parskip\nobreak |
\endgroup} |
\endgroup} |
Line 4552 width0pt\relax} \fi |
|
Line 5185 width0pt\relax} \fi |
|
\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} |
\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}} |
\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} |
\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}} |
\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} |
\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}} |
|
\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}} |
\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} |
\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}} |
\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} |
\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}} |
\def\defunx#1 {\errmessage{@defunx in invalid context}} |
\def\defunx#1 {\errmessage{@defunx in invalid context}} |
Line 4678 width0pt\relax} \fi |
|
Line 5312 width0pt\relax} \fi |
|
\message{Warning: redefining \the\macname}% |
\message{Warning: redefining \the\macname}% |
\else |
\else |
\expandafter\ifx\csname \the\macname\endcsname \relax |
\expandafter\ifx\csname \the\macname\endcsname \relax |
\else \errmessage{The name \the\macname\space is reserved}\fi |
\else \errmessage{Macro name \the\macname\space already defined}\fi |
\global\cslet{macsave.\the\macname}{\the\macname}% |
\global\cslet{macsave.\the\macname}{\the\macname}% |
\global\expandafter\let\csname ismacro.\the\macname\endcsname=1% |
\global\expandafter\let\csname ismacro.\the\macname\endcsname=1% |
% Add the macroname to \macrolist |
% Add the macroname to \macrolist |
Line 4839 width0pt\relax} \fi |
|
Line 5473 width0pt\relax} \fi |
|
|
|
|
|
% @alias. |
% @alias. |
\def\alias#1=#2{\gdef#1{#2}} |
% We need some trickery to remove the optional spaces around the equal |
|
% sign. Just make them active and then expand them all to nothing. |
|
\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx} |
|
\def\aliasxxx #1{\aliasyyy#1\relax} |
|
\def\aliasyyy #1=#2\relax{\ignoreactivespaces |
|
\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=% |
|
\expandafter\noexpand\csname#2\endcsname}% |
|
\expandafter\endgroup\next} |
|
|
|
|
\message{cross references,} |
\message{cross references,} |
|
% @xref etc. |
|
|
\newwrite\auxfile |
\newwrite\auxfile |
|
|
\newif\ifhavexrefs % True if xref values are known. |
\newif\ifhavexrefs % True if xref values are known. |
Line 4885 width0pt\relax} \fi |
|
Line 5528 width0pt\relax} \fi |
|
|
|
% @anchor{NAME} -- define xref target at arbitrary point. |
% @anchor{NAME} -- define xref target at arbitrary point. |
% |
% |
{ \catcode`\@ = 11 |
\newcount\savesfregister |
% From latex.ltx, to make @anchor truely invisible. |
\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} |
\newdimen\@savsk |
\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} |
\newcount\@savsf |
\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} |
\gdef\@bsphack{\relax |
|
\ifhmode \@savsk\lastskip \@savsf\spacefactor \fi |
|
} |
|
\gdef\@esphack{\relax |
|
\ifhmode \spacefactor\@savsf |
|
\ifdim\@savsk>\z@ \ignorespaces \fi |
|
\fi |
|
} |
|
\gdef\anchor#1{\@bsphack \setref{#1}{Ynothing}\@esphack} |
|
} |
|
|
|
% \setref{NAME}{SNT} defines a cross-reference point NAME, namely |
% \setref{NAME}{SNT} defines a cross-reference point NAME, namely |
% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have |
% NAME-title, NAME-pg, and NAME-SNT. Called from \foonoderef. We have |
Line 4908 width0pt\relax} \fi |
|
Line 5541 width0pt\relax} \fi |
|
% |
% |
\def\setref#1#2{{% |
\def\setref#1#2{{% |
\indexdummies |
\indexdummies |
|
\pdfmkdest{#1}% |
\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-title}{Ytitle}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-pg}{Ypagenumber}% |
\dosetq{#1-snt}{#2}% |
\dosetq{#1-snt}{#2}% |
Line 4922 width0pt\relax} \fi |
|
Line 5556 width0pt\relax} \fi |
|
\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} |
\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} |
\def\ref#1{\xrefX[#1,,,,,,,]} |
\def\ref#1{\xrefX[#1,,,,,,,]} |
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup |
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup |
|
\unsepspaces |
\def\printedmanual{\ignorespaces #5}% |
\def\printedmanual{\ignorespaces #5}% |
\def\printednodename{\ignorespaces #3}% |
\def\printednodename{\ignorespaces #3}% |
\setbox1=\hbox{\printedmanual}% |
\setbox1=\hbox{\printedmanual}% |
Line 4955 width0pt\relax} \fi |
|
Line 5590 width0pt\relax} \fi |
|
% are best written with fairly long node names, containing hyphens, this |
% are best written with fairly long node names, containing hyphens, this |
% is a loss. Therefore, we give the text of the node name again, so it |
% is a loss. Therefore, we give the text of the node name again, so it |
% is as if TeX is seeing it for the first time. |
% is as if TeX is seeing it for the first time. |
|
\ifpdf |
|
\leavevmode |
|
\getfilename{#4}% |
|
{\normalturnoffactive |
|
\ifnum\filenamelength>0 |
|
\startlink attr{/Border [0 0 0]}% |
|
goto file{\the\filename.pdf} name{#1}% |
|
\else |
|
\startlink attr{/Border [0 0 0]}% |
|
goto name{#1}% |
|
\fi |
|
}% |
|
\linkcolor |
|
\fi |
|
% |
\ifdim \wd1 > 0pt |
\ifdim \wd1 > 0pt |
\putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}% |
\putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}% |
\else |
\else |
Line 4974 width0pt\relax} \fi |
|
Line 5624 width0pt\relax} \fi |
|
% page 3 |
% page 3 |
\turnoffactive \putwordpage\tie\refx{#1-pg}{}% |
\turnoffactive \putwordpage\tie\refx{#1-pg}{}% |
\fi |
\fi |
|
\endlink |
\endgroup} |
\endgroup} |
|
|
% \dosetq is the interface for calls from other macros |
% \dosetq is the interface for calls from other macros |
Line 5210 width0pt\relax} \fi |
|
Line 5861 width0pt\relax} \fi |
|
\xspaceskip\z@skip |
\xspaceskip\z@skip |
\parindent\defaultparindent |
\parindent\defaultparindent |
% |
% |
% Hang the footnote text off the number. |
\smallfonts \rm |
\hang |
% |
|
% Because we use hanging indentation in footnotes, a @noindent appears |
|
% to exdent this text, so make it be a no-op. makeinfo does not use |
|
% hanging indentation so @noindent can still be needed within footnote |
|
% text after an @example or the like (not that this is good style). |
|
\let\noindent = \relax |
|
% |
|
% Hang the footnote text off the number. Use \everypar in case the |
|
% footnote extends for more than one paragraph. |
|
\everypar = {\hang}% |
\textindent{\thisfootno}% |
\textindent{\thisfootno}% |
% |
% |
% Don't crash into the line above the footnote text. Since this |
% Don't crash into the line above the footnote text. Since this |
Line 5224 width0pt\relax} \fi |
|
Line 5884 width0pt\relax} \fi |
|
\else\let\next\f@t\fi \next} |
\else\let\next\f@t\fi \next} |
\def\f@@t{\bgroup\aftergroup\@foot\let\next} |
\def\f@@t{\bgroup\aftergroup\@foot\let\next} |
\def\f@t#1{#1\@foot} |
\def\f@t#1{#1\@foot} |
\def\@foot{\strut\egroup} |
\def\@foot{\strut\par\egroup} |
|
|
}%end \catcode `\@=11 |
}%end \catcode `\@=11 |
|
|
% Set the baselineskip to #1, and the lineskip and strut size |
|
% correspondingly. There is no deep meaning behind these magic numbers |
|
% used as factors; they just match (closely enough) what Knuth defined. |
|
% |
|
\def\lineskipfactor{.08333} |
|
\def\strutheightpercent{.70833} |
|
\def\strutdepthpercent {.29167} |
|
% |
|
\def\setleading#1{% |
|
\normalbaselineskip = #1\relax |
|
\normallineskip = \lineskipfactor\normalbaselineskip |
|
\normalbaselines |
|
\setbox\strutbox =\hbox{% |
|
\vrule width0pt height\strutheightpercent\baselineskip |
|
depth \strutdepthpercent \baselineskip |
|
}% |
|
} |
|
|
|
% @| inserts a changebar to the left of the current line. It should |
% @| inserts a changebar to the left of the current line. It should |
% surround any changed text. This approach does *not* work if the |
% surround any changed text. This approach does *not* work if the |
% change spans more than two lines of output. To handle that, we would |
% change spans more than two lines of output. To handle that, we would |
Line 5310 width0pt\relax} \fi |
|
Line 5952 width0pt\relax} \fi |
|
\global\warnednoepsftrue |
\global\warnednoepsftrue |
\fi |
\fi |
\else |
\else |
\imagexxx #1,,,\finish |
\imagexxx #1,,,,,\finish |
\fi |
\fi |
} |
} |
% |
% |
% Arguments to @image: |
% Arguments to @image: |
% #1 is (mandatory) image filename; we tack on .eps extension. |
% #1 is (mandatory) image filename; we tack on .eps extension. |
% #2 is (optional) width, #3 is (optional) height. |
% #2 is (optional) width, #3 is (optional) height. |
% #4 is just the usual extra ignored arg for parsing this stuff. |
% #4 is (ignored optional) html alt text. |
\def\imagexxx#1,#2,#3,#4\finish{% |
% #5 is (ignored optional) extension. |
\ifx\pdfoutput\undefined |
% #6 is just the usual extra ignored arg for parsing this stuff. |
|
\newif\ifimagevmode |
|
\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup |
|
\catcode`\^^M = 5 % in case we're inside an example |
|
\normalturnoffactive % allow _ et al. in names |
|
% If the image is by itself, center it. |
|
\ifvmode |
|
\imagevmodetrue |
|
\nobreak\bigskip |
|
% Usually we'll have text after the image which will insert |
|
% \parskip glue, so insert it here too to equalize the space |
|
% above and below. |
|
\nobreak\vskip\parskip |
|
\nobreak |
|
\line\bgroup\hss |
|
\fi |
|
% |
|
% Output the image. |
|
\ifpdf |
|
\dopdfimage{#1}{#2}{#3}% |
|
\else |
% \epsfbox itself resets \epsf?size at each figure. |
% \epsfbox itself resets \epsf?size at each figure. |
\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi |
\setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi |
\setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi |
\setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi |
\begingroup |
\epsfbox{#1.eps}% |
\catcode`\^^M = 5 % in case we're inside an example |
|
% If the image is by itself, center it. |
|
\ifvmode |
|
\nobreak\bigskip |
|
% Usually we'll have text after the image which will insert |
|
% \parskip glue, so insert it here too to equalize the space |
|
% above and below. |
|
\nobreak\vskip\parskip |
|
\nobreak |
|
\centerline{\epsfbox{#1.eps}}% |
|
\bigbreak |
|
\else |
|
% In the middle of a paragraph, no extra space. |
|
\epsfbox{#1.eps}% |
|
\fi |
|
\endgroup |
|
\else |
|
\centerline{\pdfimage #1.pdf}% |
|
\fi |
\fi |
} |
% |
|
\ifimagevmode \hss \egroup \bigbreak \fi % space after the image |
|
\endgroup} |
|
|
|
|
\message{localization,} |
\message{localization,} |
|
% and i18n. |
|
|
% @documentlanguage is usually given very early, just after |
% @documentlanguage is usually given very early, just after |
% @setfilename. If done too late, it may not override everything |
% @setfilename. If done too late, it may not override everything |
Line 5406 should work if nowhere else does.} |
|
Line 6053 should work if nowhere else does.} |
|
% Allow us to assign to \emergencystretch anyway. |
% Allow us to assign to \emergencystretch anyway. |
\def\emergencystretch{\dimen0}% |
\def\emergencystretch{\dimen0}% |
\else |
\else |
\emergencystretch = \hsize |
\emergencystretch = .15\hsize |
\divide\emergencystretch by 40 |
|
\fi |
\fi |
} |
} |
|
|
% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; |
% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; |
% 4) hoffset; 5) binding offset; 6) topskip. Then whoever calls us can |
% 4) hoffset; 5) binding offset; 6) topskip. We also call |
% set \parskip and call \setleading for \baselineskip. |
% \setleading{\textleading}, so the caller should define \textleading. |
|
% The caller should also set \parskip. |
% |
% |
\def\internalpagesizes#1#2#3#4#5#6{% |
\def\internalpagesizes#1#2#3#4#5#6{% |
\voffset = #3\relax |
\voffset = #3\relax |
Line 5434 should work if nowhere else does.} |
|
Line 6081 should work if nowhere else does.} |
|
\normaloffset = #4\relax |
\normaloffset = #4\relax |
\bindingoffset = #5\relax |
\bindingoffset = #5\relax |
% |
% |
|
\setleading{\textleading} |
|
% |
\parindent = \defaultparindent |
\parindent = \defaultparindent |
\setemergencystretch |
\setemergencystretch |
} |
} |
|
|
|
% Use `small' versions. |
|
% |
|
\def\smallenvironments{% |
|
\let\smalldisplay = \smalldisplayx |
|
\let\smallexample = \smalllispx |
|
\let\smallformat = \smallformatx |
|
\let\smalllisp = \smalllispx |
|
} |
|
|
% @letterpaper (the default). |
% @letterpaper (the default). |
\def\letterpaper{{\globaldefs = 1 |
\def\letterpaper{{\globaldefs = 1 |
\parskip = 3pt plus 2pt minus 1pt |
\parskip = 3pt plus 2pt minus 1pt |
\setleading{13.2pt}% |
\textleading = 13.2pt |
% |
% |
% If page is nothing but text, make it come out even. |
% If page is nothing but text, make it come out even. |
\internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}% |
\internalpagesizes{46\baselineskip}{6in}{\voffset}{.25in}{\bindingoffset}{36pt}% |
Line 5450 should work if nowhere else does.} |
|
Line 6108 should work if nowhere else does.} |
|
% Use @smallbook to reset parameters for 7x9.5 (or so) format. |
% Use @smallbook to reset parameters for 7x9.5 (or so) format. |
\def\smallbook{{\globaldefs = 1 |
\def\smallbook{{\globaldefs = 1 |
\parskip = 2pt plus 1pt |
\parskip = 2pt plus 1pt |
\setleading{12pt}% |
\textleading = 12pt |
% |
% |
\internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}% |
\internalpagesizes{7.5in}{5.in}{\voffset}{.25in}{\bindingoffset}{16pt}% |
% |
% |
Line 5460 should work if nowhere else does.} |
|
Line 6118 should work if nowhere else does.} |
|
\contentsrightmargin = 0pt |
\contentsrightmargin = 0pt |
\deftypemargin = 0pt |
\deftypemargin = 0pt |
\defbodyindent = .5cm |
\defbodyindent = .5cm |
% |
\smallenvironments |
\let\smalldisplay = \smalldisplayx |
|
\let\smallexample = \smalllispx |
|
\let\smallformat = \smallformatx |
|
\let\smalllisp = \smalllispx |
|
}} |
}} |
|
|
% Use @afourpaper to print on European A4 paper. |
% Use @afourpaper to print on European A4 paper. |
\def\afourpaper{{\globaldefs = 1 |
\def\afourpaper{{\globaldefs = 1 |
\setleading{12pt}% |
|
\parskip = 3pt plus 2pt minus 1pt |
\parskip = 3pt plus 2pt minus 1pt |
|
\textleading = 12pt |
% |
% |
\internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}% |
\internalpagesizes{53\baselineskip}{160mm}{\voffset}{4mm}{\bindingoffset}{44pt}% |
% |
% |
Line 5478 should work if nowhere else does.} |
|
Line 6132 should work if nowhere else does.} |
|
\hfuzz = 1pt |
\hfuzz = 1pt |
}} |
}} |
|
|
|
% Use @afivepaper to print on European A5 paper. |
|
% From romildo@urano.iceb.ufop.br, 2 July 2000. |
|
% He also recommends making @example and @lisp be small. |
|
\def\afivepaper{{\globaldefs = 1 |
|
\parskip = 2pt plus 1pt minus 0.1pt |
|
\textleading = 12.5pt |
|
% |
|
\internalpagesizes{166mm}{120mm}{\voffset}{-8mm}{\bindingoffset}{8pt}% |
|
% |
|
\lispnarrowing = 0.2in |
|
\tolerance = 800 |
|
\hfuzz = 1.2pt |
|
\contentsrightmargin = 0mm |
|
\deftypemargin = 0pt |
|
\defbodyindent = 2mm |
|
\tableindent = 12mm |
|
% |
|
\smallenvironments |
|
}} |
|
|
% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin |
% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin |
% 29mm, hence bottom margin 28mm, nominal side margin 3cm. |
% 29mm, hence bottom margin 28mm, nominal side margin 3cm. |
\def\afourlatex{{\globaldefs = 1 |
\def\afourlatex{{\globaldefs = 1 |
\setleading{13.6pt}% |
\textleading = 13.6pt |
% |
% |
\afourpaper |
\afourpaper |
\internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}% |
\internalpagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm}% |
% |
% |
|
% Must explicitly reset to 0 because we call \afourpaper, apparently, |
|
% although this does not entirely make sense. |
\globaldefs = 0 |
\globaldefs = 0 |
}} |
}} |
|
|
% Use @afourwide to print on European A4 paper in wide format. |
% Use @afourwide to print on European A4 paper in wide format. |
\def\afourwide{% |
\def\afourwide{% |
\afourpaper |
\afourpaper |
\internalpagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}% |
\internalpagesizes{6.5in}{9.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}% |
% |
|
\globaldefs = 0 |
|
} |
} |
|
|
% @pagesizes TEXTHEIGHT[,TEXTWIDTH] |
% @pagesizes TEXTHEIGHT[,TEXTWIDTH] |
Line 5508 should work if nowhere else does.} |
|
Line 6182 should work if nowhere else does.} |
|
\globaldefs = 1 |
\globaldefs = 1 |
% |
% |
\parskip = 3pt plus 2pt minus 1pt |
\parskip = 3pt plus 2pt minus 1pt |
\setleading{13.2pt}% |
\setleading{\textleading}% |
% |
% |
\internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}% |
\internalpagesizes{#1}{\hsize}{\voffset}{\normaloffset}{\bindingoffset}{44pt}% |
}} |
}} |
Line 5517 should work if nowhere else does.} |
|
Line 6191 should work if nowhere else does.} |
|
% |
% |
\letterpaper |
\letterpaper |
|
|
|
|
\message{and turning on texinfo input format.} |
\message{and turning on texinfo input format.} |
|
|
% Define macros to output various characters with catcode for normal text. |
% Define macros to output various characters with catcode for normal text. |
Line 5537 should work if nowhere else does.} |
|
Line 6212 should work if nowhere else does.} |
|
\def\normalless{<} |
\def\normalless{<} |
\def\normalgreater{>} |
\def\normalgreater{>} |
\def\normalplus{+} |
\def\normalplus{+} |
\def\normaldollar{$} |
\def\normaldollar{$}%$ font-lock fix |
|
|
% This macro is used to make a character print one way in ttfont |
% This macro is used to make a character print one way in ttfont |
% where it can probably just be output, and another way in other fonts, |
% where it can probably just be output, and another way in other fonts, |
Line 5586 should work if nowhere else does.} |
|
Line 6261 should work if nowhere else does.} |
|
\catcode`\+=\active |
\catcode`\+=\active |
\def+{{\tt \char 43}} |
\def+{{\tt \char 43}} |
\catcode`\$=\active |
\catcode`\$=\active |
\def${\ifusingit{{\sl\$}}\normaldollar} |
\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix |
%\catcode 27=\active |
%\catcode 27=\active |
%\def^^[{$\diamondsuit$} |
%\def^^[{$\diamondsuit$} |
|
|
Line 5631 should work if nowhere else does.} |
|
Line 6306 should work if nowhere else does.} |
|
@let<=@normalless |
@let<=@normalless |
@let>=@normalgreater |
@let>=@normalgreater |
@let+=@normalplus |
@let+=@normalplus |
@let$=@normaldollar} |
@let$=@normaldollar}%$ font-lock fix |
|
|
@def@normalturnoffactive{@let"=@normaldoublequote |
@def@normalturnoffactive{@let"=@normaldoublequote |
@let\=@normalbackslash |
@let\=@normalbackslash |
Line 5642 should work if nowhere else does.} |
|
Line 6317 should work if nowhere else does.} |
|
@let<=@normalless |
@let<=@normalless |
@let>=@normalgreater |
@let>=@normalgreater |
@let+=@normalplus |
@let+=@normalplus |
@let$=@normaldollar} |
@let$=@normaldollar}%$ font-lock fix |
|
|
% Make _ and + \other characters, temporarily. |
% Make _ and + \other characters, temporarily. |
% This is canceled by @fixbackslash. |
% This is canceled by @fixbackslash. |
Line 5684 should work if nowhere else does.} |
|
Line 6359 should work if nowhere else does.} |
|
@c eval: (add-hook 'write-file-hooks 'time-stamp) |
@c eval: (add-hook 'write-file-hooks 'time-stamp) |
@c page-delimiter: "^\\\\message" |
@c page-delimiter: "^\\\\message" |
@c time-stamp-start: "def\\\\texinfoversion{" |
@c time-stamp-start: "def\\\\texinfoversion{" |
@c time-stamp-format: "%:y-%02m-%02d.%H" |
@c time-stamp-format: "%:y-%02m-%02d.%02H" |
@c time-stamp-end: "}" |
@c time-stamp-end: "}" |
@c End: |
@c End: |