version 1.1.1.1, 2012/02/21 17:26:11
|
version 1.1.1.2, 2012/05/29 11:53:41
|
Line 3
|
Line 3
|
% 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{2009-08-14.15} | \def\texinfoversion{2011-11-09.15} |
% |
% |
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, |
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, |
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, |
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, |
% 2007, 2008, 2009 Free Software Foundation, Inc. | % 2007, 2008, 2009, 2010, 2011 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 |
Line 65
|
Line 65
|
\everyjob{\message{[Texinfo version \texinfoversion]}% |
\everyjob{\message{[Texinfo version \texinfoversion]}% |
\catcode`+=\active \catcode`\_=\active} |
\catcode`+=\active \catcode`\_=\active} |
|
|
|
|
\chardef\other=12 |
\chardef\other=12 |
|
|
% We never want plain's \outer definition of \+ in Texinfo. |
% We never want plain's \outer definition of \+ in Texinfo. |
Line 93
|
Line 92
|
\let\ptexnewwrite\newwrite |
\let\ptexnewwrite\newwrite |
\let\ptexnoindent=\noindent |
\let\ptexnoindent=\noindent |
\let\ptexplus=+ |
\let\ptexplus=+ |
|
\let\ptexraggedright=\raggedright |
\let\ptexrbrace=\} |
\let\ptexrbrace=\} |
\let\ptexslash=\/ |
\let\ptexslash=\/ |
\let\ptexstar=\* |
\let\ptexstar=\* |
\let\ptext=\t |
\let\ptext=\t |
\let\ptextop=\top |
\let\ptextop=\top |
{\catcode`\'=\active | {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode |
\global\let\ptexquoteright'}% Math-mode def from plain.tex. | |
\let\ptexraggedright=\raggedright | |
|
|
% If this character appears in an error message or help string, it |
% If this character appears in an error message or help string, it |
% starts a new line in the output. |
% starts a new line in the output. |
Line 118
|
Line 116
|
% Set up fixed words for English if not already set. |
% Set up fixed words for English if not already set. |
\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi |
\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi |
\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi |
\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi |
|
\ifx\putworderror\undefined \gdef\putworderror{error}\fi |
\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi |
\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi |
\ifx\putwordin\undefined \gdef\putwordin{in}\fi |
\ifx\putwordin\undefined \gdef\putwordin{in}\fi |
\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi | \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi |
\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi | \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi |
\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi |
\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi |
\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi |
\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi |
\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi |
\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi |
Line 160
|
Line 159
|
\def\spaceisspace{\catcode`\ =\spacecat} |
\def\spaceisspace{\catcode`\ =\spacecat} |
|
|
% sometimes characters are active, so we need control sequences. |
% sometimes characters are active, so we need control sequences. |
|
\chardef\ampChar = `\& |
\chardef\colonChar = `\: |
\chardef\colonChar = `\: |
\chardef\commaChar = `\, |
\chardef\commaChar = `\, |
\chardef\dashChar = `\- |
\chardef\dashChar = `\- |
\chardef\dotChar = `\. |
\chardef\dotChar = `\. |
\chardef\exclamChar= `\! |
\chardef\exclamChar= `\! |
|
\chardef\hashChar = `\# |
\chardef\lquoteChar= `\` |
\chardef\lquoteChar= `\` |
\chardef\questChar = `\? |
\chardef\questChar = `\? |
\chardef\rquoteChar= `\' |
\chardef\rquoteChar= `\' |
\chardef\semiChar = `\; |
\chardef\semiChar = `\; |
|
\chardef\slashChar = `\/ |
\chardef\underChar = `\_ |
\chardef\underChar = `\_ |
|
|
% Ignore a token. |
% Ignore a token. |
Line 199
|
Line 201
|
% that mark overfull boxes (in case you have decided |
% that mark overfull boxes (in case you have decided |
% that the text looks ok even though it passes the margin). |
% that the text looks ok even though it passes the margin). |
% |
% |
\def\finalout{\overfullrule=0pt} | \def\finalout{\overfullrule=0pt } |
|
|
% @| inserts a changebar to the left of the current line. It should |
|
% surround any changed text. This approach does *not* work if the |
|
% change spans more than two lines of output. To handle that, we would |
|
% have adopt a much more difficult approach (putting marks into the main |
|
% vertical list for the beginning and end of each change). |
|
% |
|
\def\|{% |
|
% \vadjust can only be used in horizontal mode. |
|
\leavevmode |
|
% |
|
% Append this vertical mode material after the current line in the output. |
|
\vadjust{% |
|
% We want to insert a rule with the height and depth of the current |
|
% leading; that is exactly what \strutbox is supposed to record. |
|
\vskip-\baselineskip |
|
% |
|
% \vadjust-items are inserted at the left edge of the type. So |
|
% the \llap here moves out into the left-hand margin. |
|
\llap{% |
|
% |
|
% For a thicker or thinner bar, change the `1pt'. |
|
\vrule height\baselineskip width1pt |
|
% |
|
% This is the space between the bar and the text. |
|
\hskip 12pt |
|
}% |
|
}% |
|
} |
|
|
|
% Sometimes it is convenient to have everything in the transcript file |
% Sometimes it is convenient to have everything in the transcript file |
% and nothing on the terminal. We don't just call \tracingall here, |
% and nothing on the terminal. We don't just call \tracingall here, |
% since that produces some useless output on the terminal. We also make |
% since that produces some useless output on the terminal. We also make |
Line 246
|
Line 219
|
\tracingmacros2 |
\tracingmacros2 |
\tracingrestores1 |
\tracingrestores1 |
\showboxbreadth\maxdimen \showboxdepth\maxdimen |
\showboxbreadth\maxdimen \showboxdepth\maxdimen |
\ifx\eTeXversion\undefined\else % etex gives us more logging | \ifx\eTeXversion\thisisundefined\else % etex gives us more logging |
\tracingscantokens1 |
\tracingscantokens1 |
\tracingifs1 |
\tracingifs1 |
\tracinggroups1 |
\tracinggroups1 |
Line 267
|
Line 240
|
\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount |
\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount |
\removelastskip\penalty-200\bigskip\fi\fi} |
\removelastskip\penalty-200\bigskip\fi\fi} |
|
|
% For @cropmarks command. |
|
% Do @cropmarks to get crop marks. |
% Do @cropmarks to get crop marks. |
% |
% |
\newif\ifcropmarks |
\newif\ifcropmarks |
Line 577
|
Line 549
|
} |
} |
\def\inenvironment#1{% |
\def\inenvironment#1{% |
\ifx#1\empty |
\ifx#1\empty |
out of any environment% | outside of any environment% |
\else |
\else |
in environment \expandafter\string#1% |
in environment \expandafter\string#1% |
\fi |
\fi |
Line 589
|
Line 561
|
\parseargdef\end{% |
\parseargdef\end{% |
\if 1\csname iscond.#1\endcsname |
\if 1\csname iscond.#1\endcsname |
\else |
\else |
% The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 | % The general wording of \badenverr may not be ideal. |
\expandafter\checkenv\csname#1\endcsname |
\expandafter\checkenv\csname#1\endcsname |
\csname E#1\endcsname |
\csname E#1\endcsname |
\endgroup |
\endgroup |
Line 599
|
Line 571
|
\newhelp\EMsimple{Press RETURN to continue.} |
\newhelp\EMsimple{Press RETURN to continue.} |
|
|
|
|
%% Simple single-character @ commands |
|
|
|
% @@ prints an @ |
|
% Kludge this until the fonts are right (grr). |
|
\def\@{{\tt\char64}} |
|
|
|
% This is turned off because it was never documented |
|
% and you can use @w{...} around a quote to suppress ligatures. |
|
%% Define @` and @' to be the same as ` and ' |
|
%% but suppressing ligatures. |
|
%\def\`{{`}} |
|
%\def\'{{'}} |
|
|
|
% Used to generate quoted braces. |
|
\def\mylbrace {{\tt\char123}} |
|
\def\myrbrace {{\tt\char125}} |
|
\let\{=\mylbrace |
|
\let\}=\myrbrace |
|
\begingroup |
|
% Definitions to produce \{ and \} commands for indices, |
|
% and @{ and @} for the aux/toc files. |
|
\catcode`\{ = \other \catcode`\} = \other |
|
\catcode`\[ = 1 \catcode`\] = 2 |
|
\catcode`\! = 0 \catcode`\\ = \other |
|
!gdef!lbracecmd[\{]% |
|
!gdef!rbracecmd[\}]% |
|
!gdef!lbraceatcmd[@{]% |
|
!gdef!rbraceatcmd[@}]% |
|
!endgroup |
|
|
|
% @comma{} to avoid , parsing problems. |
|
\let\comma = , |
|
|
|
% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent |
|
% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. |
|
\let\, = \c |
|
\let\dotaccent = \. |
|
\def\ringaccent#1{{\accent23 #1}} |
|
\let\tieaccent = \t |
|
\let\ubaraccent = \b |
|
\let\udotaccent = \d |
|
|
|
% Other special characters: @questiondown @exclamdown @ordf @ordm |
|
% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. |
|
\def\questiondown{?`} |
|
\def\exclamdown{!`} |
|
\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} |
|
\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} |
|
|
|
% Dotless i and dotless j, used for accents. |
|
\def\imacro{i} |
|
\def\jmacro{j} |
|
\def\dotless#1{% |
|
\def\temp{#1}% |
|
\ifx\temp\imacro \ifmmode\imath \else\ptexi \fi |
|
\else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi |
|
\else \errmessage{@dotless can be used only with i or j}% |
|
\fi\fi |
|
} |
|
|
|
% The \TeX{} logo, as in plain, but resetting the spacing so that a |
|
% period following counts as ending a sentence. (Idea found in latex.) |
|
% |
|
\edef\TeX{\TeX \spacefactor=1000 } |
|
|
|
% @LaTeX{} logo. Not quite the same results as the definition in |
|
% latex.ltx, since we use a different font for the raised A; it's most |
|
% convenient for us to use an explicitly smaller font, rather than using |
|
% the \scriptstyle font (since we don't reset \scriptstyle and |
|
% \scriptscriptstyle). |
|
% |
|
\def\LaTeX{% |
|
L\kern-.36em |
|
{\setbox0=\hbox{T}% |
|
\vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% |
|
\kern-.15em |
|
\TeX |
|
} |
|
|
|
% Be sure we're in horizontal mode when doing a tie, since we make space |
% Be sure we're in horizontal mode when doing a tie, since we make space |
% equivalent to this in @example-like environments. Otherwise, a space |
% equivalent to this in @example-like environments. Otherwise, a space |
% at the beginning of a line will start with \penalty -- and |
% at the beginning of a line will start with \penalty -- and |
Line 719
|
Line 612
|
\else\ifx\temp\offword \plainnonfrenchspacing |
\else\ifx\temp\offword \plainnonfrenchspacing |
\else |
\else |
\errhelp = \EMsimple |
\errhelp = \EMsimple |
\errmessage{Unknown @frenchspacing option `\temp', must be on/off}% | \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% |
\fi\fi |
\fi\fi |
} |
} |
|
|
Line 801 where each line of input produces a line of output.}
|
Line 694 where each line of input produces a line of output.}
|
|
|
\newdimen\mil \mil=0.001in |
\newdimen\mil \mil=0.001in |
|
|
% Old definition--didn't work. |
|
%\parseargdef\need{\par % |
|
%% This method tries to make TeX break the page naturally |
|
%% if the depth of the box does not fit. |
|
%{\baselineskip=0pt% |
|
%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak |
|
%\prevdepth=-1000pt |
|
%}} |
|
|
|
\parseargdef\need{% |
\parseargdef\need{% |
% Ensure 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. |
Line 873 where each line of input produces a line of output.}
|
Line 757 where each line of input produces a line of output.}
|
|
|
% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current |
% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current |
% paragraph. For more general purposes, use the \margin insertion |
% paragraph. For more general purposes, use the \margin insertion |
% class. WHICH is `l' or `r'. | % class. WHICH is `l' or `r'. Not documented, written for gawk manual. |
% |
% |
\newskip\inmarginspacing \inmarginspacing=1cm |
\newskip\inmarginspacing \inmarginspacing=1cm |
\def\strutdepth{\dp\strutbox} |
\def\strutdepth{\dp\strutbox} |
Line 920 where each line of input produces a line of output.}
|
Line 804 where each line of input produces a line of output.}
|
\temp |
\temp |
} |
} |
|
|
|
% @| inserts a changebar to the left of the current line. It should |
|
% surround any changed text. This approach does *not* work if the |
|
% change spans more than two lines of output. To handle that, we would |
|
% have adopt a much more difficult approach (putting marks into the main |
|
% vertical list for the beginning and end of each change). This command |
|
% is not documented, not supported, and doesn't work. |
|
% |
|
\def\|{% |
|
% \vadjust can only be used in horizontal mode. |
|
\leavevmode |
|
% |
|
% Append this vertical mode material after the current line in the output. |
|
\vadjust{% |
|
% We want to insert a rule with the height and depth of the current |
|
% leading; that is exactly what \strutbox is supposed to record. |
|
\vskip-\baselineskip |
|
% |
|
% \vadjust-items are inserted at the left edge of the type. So |
|
% the \llap here moves out into the left-hand margin. |
|
\llap{% |
|
% |
|
% For a thicker or thinner bar, change the `1pt'. |
|
\vrule height\baselineskip width1pt |
|
% |
|
% This is the space between the bar and the text. |
|
\hskip 12pt |
|
}% |
|
}% |
|
} |
|
|
% @include FILE -- \input text of FILE. |
% @include FILE -- \input text of FILE. |
% |
% |
\def\include{\parseargusing\filenamecatcodes\includezzz} |
\def\include{\parseargusing\filenamecatcodes\includezzz} |
Line 930 where each line of input produces a line of output.}
|
Line 844 where each line of input produces a line of output.}
|
\makevalueexpandable % we want to expand any @value in FILE. |
\makevalueexpandable % we want to expand any @value in FILE. |
\turnoffactive % and allow special characters in the expansion |
\turnoffactive % and allow special characters in the expansion |
\indexnofonts % Allow `@@' and other weird things in file names. |
\indexnofonts % Allow `@@' and other weird things in file names. |
|
\wlog{texinfo.tex: doing @include of #1^^J}% |
\edef\temp{\noexpand\input #1 }% |
\edef\temp{\noexpand\input #1 }% |
% |
% |
% This trickery is to read FILE outside of a group, in case it makes |
% This trickery is to read FILE outside of a group, in case it makes |
Line 1095 where each line of input produces a line of output.}
|
Line 1010 where each line of input produces a line of output.}
|
} |
} |
|
|
|
|
% @asis just yields its argument. Used with @table, for example. |
|
% |
|
\def\asis#1{#1} |
|
|
|
% @math outputs its argument in math mode. |
|
% |
|
% One complication: _ usually means subscripts, but it could also mean |
|
% an actual _ character, as in @math{@var{some_variable} + 1}. So make |
|
% _ active, and distinguish by seeing if the current family is \slfam, |
|
% which is what @var uses. |
|
{ |
|
\catcode`\_ = \active |
|
\gdef\mathunderscore{% |
|
\catcode`\_=\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 |
|
\mathunderscore |
|
\let\\ = \mathbackslash |
|
\mathactive |
|
% make the texinfo accent commands work in math mode |
|
\let\"=\ddot |
|
\let\'=\acute |
|
\let\==\bar |
|
\let\^=\hat |
|
\let\`=\grave |
|
\let\u=\breve |
|
\let\v=\check |
|
\let\~=\tilde |
|
\let\dotaccent=\dot |
|
$\finishmath |
|
} |
|
\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. |
|
|
|
% Some active characters (such as <) are spaced differently in math. |
|
% We have to reset their definitions in case the @math was an argument |
|
% to a command which sets the catcodes (such as @item or @section). |
|
% |
|
{ |
|
\catcode`^ = \active |
|
\catcode`< = \active |
|
\catcode`> = \active |
|
\catcode`+ = \active |
|
\catcode`' = \active |
|
\gdef\mathactive{% |
|
\let^ = \ptexhat |
|
\let< = \ptexless |
|
\let> = \ptexgtr |
|
\let+ = \ptexplus |
|
\let' = \ptexquoteright |
|
} |
|
} |
|
|
|
% Some math mode symbols. |
|
\def\bullet{$\ptexbullet$} |
|
\def\geq{\ifmmode \ge\else $\ge$\fi} |
|
\def\leq{\ifmmode \le\else $\le$\fi} |
|
\def\minus{\ifmmode -\else $-$\fi} |
|
|
|
% @dots{} outputs an ellipsis using the current font. |
|
% We do .5em per period so that it has the same spacing in the cm |
|
% typewriter fonts as three actual period characters; on the other hand, |
|
% in other typewriter fonts three periods are wider than 1.5em. So do |
|
% whichever is larger. |
|
% |
|
\def\dots{% |
|
\leavevmode |
|
\setbox0=\hbox{...}% get width of three periods |
|
\ifdim\wd0 > 1.5em |
|
\dimen0 = \wd0 |
|
\else |
|
\dimen0 = 1.5em |
|
\fi |
|
\hbox to \dimen0{% |
|
\hskip 0pt plus.25fil |
|
.\hskip 0pt plus1fil |
|
.\hskip 0pt plus1fil |
|
.\hskip 0pt plus.5fil |
|
}% |
|
} |
|
|
|
% @enddots{} is an end-of-sentence ellipsis. |
|
% |
|
\def\enddots{% |
|
\dots |
|
\spacefactor=\endofsentencespacefactor |
|
} |
|
|
|
% @comma{} is so commas can be inserted into text without messing up |
|
% Texinfo's parsing. |
|
% |
|
\let\comma = , |
|
|
|
% @refill is a no-op. |
% @refill is a no-op. |
\let\refill=\relax |
\let\refill=\relax |
|
|
Line 1262 where each line of input produces a line of output.}
|
Line 1074 where each line of input produces a line of output.}
|
\newif\ifpdfmakepagedest |
\newif\ifpdfmakepagedest |
|
|
% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 |
% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 |
% can be set). So we test for \relax and 0 as well as \undefined, | % can be set). So we test for \relax and 0 as well as being undefined. |
% borrowed from ifpdf.sty. | \ifx\pdfoutput\thisisundefined |
\ifx\pdfoutput\undefined | |
\else |
\else |
\ifx\pdfoutput\relax |
\ifx\pdfoutput\relax |
\else |
\else |
Line 1384 output) for that.)}
|
Line 1195 output) for that.)}
|
\def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% |
\def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% |
\def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% |
\def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% |
% |
% |
% pdftex (and the PDF format) support .png, .jpg, .pdf (among | % pdftex (and the PDF format) support .pdf, .png, .jpg (among |
% others). Let's try in that order. | % others). Let's try in that order, PDF first since if |
| % someone has a scalable image, presumably better to use that than a |
| % bitmap. |
\let\pdfimgext=\empty |
\let\pdfimgext=\empty |
\begingroup |
\begingroup |
\openin 1 #1.png \ifeof 1 | \openin 1 #1.pdf \ifeof 1 |
\openin 1 #1.jpg \ifeof 1 | \openin 1 #1.PDF \ifeof 1 |
\openin 1 #1.jpeg \ifeof 1 | \openin 1 #1.png \ifeof 1 |
\openin 1 #1.JPG \ifeof 1 | \openin 1 #1.jpg \ifeof 1 |
\openin 1 #1.pdf \ifeof 1 | \openin 1 #1.jpeg \ifeof 1 |
\openin 1 #1.PDF \ifeof 1 | \openin 1 #1.JPG \ifeof 1 |
\errhelp = \nopdfimagehelp |
\errhelp = \nopdfimagehelp |
\errmessage{Could not find image file #1 for pdf}% |
\errmessage{Could not find image file #1 for pdf}% |
\else \gdef\pdfimgext{PDF}% | \else \gdef\pdfimgext{JPG}% |
\fi |
\fi |
\else \gdef\pdfimgext{pdf}% | \else \gdef\pdfimgext{jpeg}% |
\fi |
\fi |
\else \gdef\pdfimgext{JPG}% | \else \gdef\pdfimgext{jpg}% |
\fi |
\fi |
\else \gdef\pdfimgext{jpeg}% | \else \gdef\pdfimgext{png}% |
\fi |
\fi |
\else \gdef\pdfimgext{jpg}% | \else \gdef\pdfimgext{PDF}% |
\fi |
\fi |
\else \gdef\pdfimgext{png}% | \else \gdef\pdfimgext{pdf}% |
\fi |
\fi |
\closein 1 |
\closein 1 |
\endgroup |
\endgroup |
Line 1492 output) for that.)}
|
Line 1305 output) for that.)}
|
\edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace |
\edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace |
% |
% |
% Read toc silently, to get counts of subentries for \pdfoutline. |
% Read toc silently, to get counts of subentries for \pdfoutline. |
|
\def\partentry##1##2##3##4{}% ignore parts in the outlines |
\def\numchapentry##1##2##3##4{% |
\def\numchapentry##1##2##3##4{% |
\def\thischapnum{##2}% |
\def\thischapnum{##2}% |
\def\thissecnum{0}% |
\def\thissecnum{0}% |
Line 1695 output) for that.)}
|
Line 1509 output) for that.)}
|
% if we are producing pdf, and we have \pdffontattr, then define cmaps. |
% if we are producing pdf, and we have \pdffontattr, then define cmaps. |
% (\pdffontattr was introduced many years ago, but people still run |
% (\pdffontattr was introduced many years ago, but people still run |
% older pdftex's; it's easy to conditionalize, so we do.) |
% older pdftex's; it's easy to conditionalize, so we do.) |
\ifpdf \ifx\pdffontattr\undefined \else | \ifpdf \ifx\pdffontattr\thisisundefined \else |
\begingroup |
\begingroup |
\catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. |
\catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. |
\catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap |
\catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap |
Line 1962 end
|
Line 1776 end
|
% Use cm as the default font prefix. |
% Use cm as the default font prefix. |
% To specify the font prefix, you must define \fontprefix |
% To specify the font prefix, you must define \fontprefix |
% before you read in texinfo.tex. |
% before you read in texinfo.tex. |
\ifx\fontprefix\undefined | \ifx\fontprefix\thisisundefined |
\def\fontprefix{cm} |
\def\fontprefix{cm} |
\fi |
\fi |
% Support font families that don't use the same naming scheme as CM. |
% Support font families that don't use the same naming scheme as CM. |
Line 2105 end
|
Line 1919 end
|
\font\reducedsy=cmsy10 |
\font\reducedsy=cmsy10 |
\def\reducedecsize{1000} |
\def\reducedecsize{1000} |
|
|
% reset the current fonts | \textleading = 13.2pt % line spacing for 11pt CM |
\textfonts | \textfonts % reset the current fonts |
\rm |
\rm |
} % end of 11pt text font size definitions |
} % end of 11pt text font size definitions |
|
|
Line 2236 end
|
Line 2050 end
|
\font\reducedsy=cmsy9 |
\font\reducedsy=cmsy9 |
\def\reducedecsize{0900} |
\def\reducedecsize{0900} |
|
|
% reduce space between paragraphs | \divide\parskip by 2 % reduce space between paragraphs |
\divide\parskip by 2 | \textleading = 12pt % line spacing for 10pt CM |
| \textfonts % reset the current fonts |
% reset the current fonts | |
\textfonts | |
\rm |
\rm |
} % end of 10pt text font size definitions |
} % end of 10pt text font size definitions |
|
|
Line 2249 end
|
Line 2061 end
|
% @fonttextsize 10 |
% @fonttextsize 10 |
% (or 11) to redefine the text font size. pt is assumed. |
% (or 11) to redefine the text font size. pt is assumed. |
% |
% |
\def\xword{10} |
|
\def\xiword{11} |
\def\xiword{11} |
|
\def\xword{10} |
|
\def\xwordpt{10pt} |
% |
% |
\parseargdef\fonttextsize{% |
\parseargdef\fonttextsize{% |
\def\textsizearg{#1}% |
\def\textsizearg{#1}% |
\wlog{doing @fonttextsize \textsizearg}% | %\wlog{doing @fonttextsize \textsizearg}% |
% |
% |
% Set \globaldefs so that documents can use this inside @tex, since |
% Set \globaldefs so that documents can use this inside @tex, since |
% makeinfo 4.8 does not support it, but we need it nonetheless. |
% makeinfo 4.8 does not support it, but we need it nonetheless. |
Line 2308 end
|
Line 2121 end
|
\let\tenttsl=\titlettsl |
\let\tenttsl=\titlettsl |
\def\curfontsize{title}% |
\def\curfontsize{title}% |
\def\lsize{chap}\def\lllsize{subsec}% |
\def\lsize{chap}\def\lllsize{subsec}% |
\resetmathfonts \setleading{25pt}} | \resetmathfonts \setleading{27pt}} |
\def\titlefont#1{{\titlefonts\rmisbold #1}} |
\def\titlefont#1{{\titlefonts\rmisbold #1}} |
\def\chapfonts{% |
\def\chapfonts{% |
\let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl |
\let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl |
Line 2436 end
|
Line 2249 end
|
|
|
% Markup style setup for left and right quotes. |
% Markup style setup for left and right quotes. |
\defmarkupstylesetup\markupsetuplq{% |
\defmarkupstylesetup\markupsetuplq{% |
\expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname | \expandafter\let\expandafter \temp |
| \csname markupsetuplq\currentmarkupstyle\endcsname |
\ifx\temp\relax \markupsetuplqdefault \else \temp \fi |
\ifx\temp\relax \markupsetuplqdefault \else \temp \fi |
} |
} |
|
|
\defmarkupstylesetup\markupsetuprq{% |
\defmarkupstylesetup\markupsetuprq{% |
\expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname | \expandafter\let\expandafter \temp |
| \csname markupsetuprq\currentmarkupstyle\endcsname |
\ifx\temp\relax \markupsetuprqdefault \else \temp \fi |
\ifx\temp\relax \markupsetuprqdefault \else \temp \fi |
} |
} |
|
|
Line 2460 end
|
Line 2275 end
|
|
|
\let\markupsetuplqcode \markupsetcodequoteleft |
\let\markupsetuplqcode \markupsetcodequoteleft |
\let\markupsetuprqcode \markupsetcodequoteright |
\let\markupsetuprqcode \markupsetcodequoteright |
|
% |
\let\markupsetuplqexample \markupsetcodequoteleft |
\let\markupsetuplqexample \markupsetcodequoteleft |
\let\markupsetuprqexample \markupsetcodequoteright |
\let\markupsetuprqexample \markupsetcodequoteright |
|
% |
|
\let\markupsetuplqsamp \markupsetcodequoteleft |
|
\let\markupsetuprqsamp \markupsetcodequoteright |
|
% |
\let\markupsetuplqverb \markupsetcodequoteleft |
\let\markupsetuplqverb \markupsetcodequoteleft |
\let\markupsetuprqverb \markupsetcodequoteright |
\let\markupsetuprqverb \markupsetcodequoteright |
|
% |
\let\markupsetuplqverbatim \markupsetcodequoteleft |
\let\markupsetuplqverbatim \markupsetcodequoteleft |
\let\markupsetuprqverbatim \markupsetcodequoteright |
\let\markupsetuprqverbatim \markupsetcodequoteright |
|
|
\let\markupsetuplqsamp \markupsetnoligaturesquoteleft |
|
\let\markupsetuplqkbd \markupsetnoligaturesquoteleft |
\let\markupsetuplqkbd \markupsetnoligaturesquoteleft |
|
|
% Allow an option to not replace quotes with a regular directed right | % Allow an option to not use regular directed right quote/apostrophe |
% quote/apostrophe (char 0x27), but instead use the undirected quote | % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). |
% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it | % The undirected quote is ugly, so don't make it the default, but it |
% the default, but it works for pasting with more pdf viewers (at least | % works for pasting with more pdf viewers (at least evince), the |
% evince), the lilypond developers report. xpdf does work with the | % lilypond developers report. xpdf does work with the regular 0x27. |
% regular 0x27. | |
% |
% |
\def\codequoteright{% |
\def\codequoteright{% |
\expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax |
\expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax |
Line 2499 end
|
Line 2318 end
|
\else \char'22 \fi |
\else \char'22 \fi |
} |
} |
|
|
|
% Commands to set the quote options. |
|
% |
|
\parseargdef\codequoteundirected{% |
|
\def\temp{#1}% |
|
\ifx\temp\onword |
|
\expandafter\let\csname SETtxicodequoteundirected\endcsname |
|
= t% |
|
\else\ifx\temp\offword |
|
\expandafter\let\csname SETtxicodequoteundirected\endcsname |
|
= \relax |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% |
|
\fi\fi |
|
} |
|
% |
|
\parseargdef\codequotebacktick{% |
|
\def\temp{#1}% |
|
\ifx\temp\onword |
|
\expandafter\let\csname SETtxicodequotebacktick\endcsname |
|
= t% |
|
\else\ifx\temp\offword |
|
\expandafter\let\csname SETtxicodequotebacktick\endcsname |
|
= \relax |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% |
|
\fi\fi |
|
} |
|
|
% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. |
% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. |
\def\noligaturesquoteleft{\relax\lq} |
\def\noligaturesquoteleft{\relax\lq} |
|
|
% Count depth in font-changes, for error checks |
% Count depth in font-changes, for error checks |
\newcount\fontdepth \fontdepth=0 |
\newcount\fontdepth \fontdepth=0 |
|
|
%% Add scribe-like font environments, plus @l for inline lisp (usually sans | % Font commands. |
%% serif) and @ii for TeX italic | |
|
|
% \smartitalic{ARG} outputs arg in italics, followed by an italic correction | % #1 is the font command (\sl or \it), #2 is the text to slant. |
% unless the following character is such as not to need one. | % If we are in a monospaced environment, however, 1) always use \ttsl, |
\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else | % and 2) do not add an italic correction. |
\ptexslash\fi\fi\fi} | \def\dosmartslant#1#2{% |
\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} | \ifusingtt |
\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} | {{\ttsl #2}\let\next=\relax}% |
| {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% |
| \next |
| } |
| \def\smartslanted{\dosmartslant\sl} |
| \def\smartitalic{\dosmartslant\it} |
|
|
% like \smartslanted except unconditionally uses \ttsl. | % Output an italic correction unless \next (presumed to be the following |
| % character) is such as not to need one. |
| \def\smartitaliccorrection{% |
| \ifx\next,% |
| \else\ifx\next-% |
| \else\ifx\next.% |
| \else\ptexslash |
| \fi\fi\fi |
| \aftersmartic |
| } |
| |
| % like \smartslanted except unconditionally uses \ttsl, and no ic. |
% @var is set to this for defun arguments. |
% @var is set to this for defun arguments. |
\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} | \def\ttslanted#1{{\ttsl #1}} |
|
|
% @cite is like \smartslanted except unconditionally use \sl. We never want |
% @cite is like \smartslanted except unconditionally use \sl. We never want |
% ttsl for book titles, do we? |
% ttsl for book titles, do we? |
\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} | \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} |
|
|
|
\def\aftersmartic{} |
|
\def\var#1{% |
|
\let\saveaftersmartic = \aftersmartic |
|
\def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% |
|
\smartslanted{#1}% |
|
} |
|
|
\let\i=\smartitalic |
\let\i=\smartitalic |
\let\slanted=\smartslanted |
\let\slanted=\smartslanted |
\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}} |
|
\let\dfn=\smartslanted |
\let\dfn=\smartslanted |
\let\emph=\smartitalic |
\let\emph=\smartitalic |
|
|
Line 2621 end
|
Line 2491 end
|
\plainfrenchspacing |
\plainfrenchspacing |
#1% |
#1% |
}% |
}% |
\null | \null % reset spacefactor to 1000 |
} |
} |
|
|
% We *must* turn on hyphenation at `-' and `_' in @code. |
% We *must* turn on hyphenation at `-' and `_' in @code. |
Line 2653 end
|
Line 2523 end
|
} |
} |
} |
} |
|
|
|
\def\codex #1{\tclose{#1}\endgroup} |
|
|
\def\realdash{-} |
\def\realdash{-} |
\def\codedash{-\discretionary{}{}{}} |
\def\codedash{-\discretionary{}{}{}} |
\def\codeunder{% |
\def\codeunder{% |
Line 2666 end
|
Line 2538 end
|
\discretionary{}{}{}}% |
\discretionary{}{}{}}% |
{\_}% |
{\_}% |
} |
} |
\def\codex #1{\tclose{#1}\endgroup} |
|
|
|
% An additional complication: the above will allow breaks after, e.g., |
% An additional complication: the above will allow breaks after, e.g., |
% each of the four underscores in __typeof__. This is undesirable in |
% each of the four underscores in __typeof__. This is undesirable in |
Line 2686 end
|
Line 2557 end
|
\allowcodebreaksfalse |
\allowcodebreaksfalse |
\else |
\else |
\errhelp = \EMsimple |
\errhelp = \EMsimple |
\errmessage{Unknown @allowcodebreaks option `\txiarg'}% | \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% |
\fi\fi |
\fi\fi |
} |
} |
|
|
% @kbd is like @code, except that if the argument is just one @key command, |
|
% then @kbd has no effect. |
|
\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} |
|
|
|
% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), |
|
% `example' (@kbd uses ttsl only inside of @example and friends), |
|
% or `code' (@kbd uses normal tty font always). |
|
\parseargdef\kbdinputstyle{% |
|
\def\txiarg{#1}% |
|
\ifx\txiarg\worddistinct |
|
\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% |
|
\else\ifx\txiarg\wordexample |
|
\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% |
|
\else\ifx\txiarg\wordcode |
|
\gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @kbdinputstyle option `\txiarg'}% |
|
\fi\fi\fi |
|
} |
|
\def\worddistinct{distinct} |
|
\def\wordexample{example} |
|
\def\wordcode{code} |
|
|
|
% Default is `distinct'. |
|
\kbdinputstyle distinct |
|
|
|
\def\xkey{\key} |
|
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% |
|
\ifx\one\xkey\ifx\threex\three \key{#2}% |
|
\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi |
|
\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} |
|
|
|
% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. |
|
\let\indicateurl=\code |
|
\let\env=\code |
|
\let\command=\code |
|
|
|
% @clicksequence{File @click{} Open ...} |
|
\def\clicksequence#1{\begingroup #1\endgroup} |
|
|
|
% @clickstyle @arrow (by default) |
|
\parseargdef\clickstyle{\def\click{#1}} |
|
\def\click{\arrow} |
|
|
|
% @uref (abbreviation for `urlref') takes an optional (comma-separated) |
% @uref (abbreviation for `urlref') takes an optional (comma-separated) |
% second argument specifying the text to display and an optional third |
% second argument specifying the text to display and an optional third |
% arg as text to display instead of (rather than in addition to) the url |
% arg as text to display instead of (rather than in addition to) the url |
% itself. First (mandatory) arg is the url. Perhaps eventually put in | % itself. First (mandatory) arg is the url. |
% a hypertex \special here. | % (This \urefnobreak definition isn't used now, leaving it for a while |
% | % for comparison.) |
\def\uref#1{\douref #1,,,\finish} | \def\urefnobreak#1{\dourefnobreak #1,,,\finish} |
\def\douref#1,#2,#3,#4\finish{\begingroup | \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup |
\unsepspaces |
\unsepspaces |
\pdfurl{#1}% |
\pdfurl{#1}% |
\setbox0 = \hbox{\ignorespaces #3}% |
\setbox0 = \hbox{\ignorespaces #3}% |
Line 2763 end
|
Line 2589 end
|
\endlink |
\endlink |
\endgroup} |
\endgroup} |
|
|
|
% This \urefbreak definition is the active one. |
|
\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} |
|
\let\uref=\urefbreak |
|
\def\dourefbreak#1{\urefbreakfinish #1,,,\finish} |
|
\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example |
|
\unsepspaces |
|
\pdfurl{#1}% |
|
\setbox0 = \hbox{\ignorespaces #3}% |
|
\ifdim\wd0 > 0pt |
|
\unhbox0 % third arg given, show only that |
|
\else |
|
\setbox0 = \hbox{\ignorespaces #2}% |
|
\ifdim\wd0 > 0pt |
|
\ifpdf |
|
\unhbox0 % PDF: 2nd arg given, show only it |
|
\else |
|
\unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url |
|
\fi |
|
\else |
|
\urefcode{#1}% only url given, so show it |
|
\fi |
|
\fi |
|
\endlink |
|
\endgroup} |
|
|
|
% Allow line breaks around only a few characters (only). |
|
\def\urefcatcodes{% |
|
\catcode\ampChar=\active \catcode\dotChar=\active |
|
\catcode\hashChar=\active \catcode\questChar=\active |
|
\catcode\slashChar=\active |
|
} |
|
{ |
|
\urefcatcodes |
|
% |
|
\global\def\urefcode{\begingroup |
|
\setupmarkupstyle{code}% |
|
\urefcatcodes |
|
\let&\urefcodeamp |
|
\let.\urefcodedot |
|
\let#\urefcodehash |
|
\let?\urefcodequest |
|
\let/\urefcodeslash |
|
\codex |
|
} |
|
% |
|
% By default, they are just regular characters. |
|
\global\def&{\normalamp} |
|
\global\def.{\normaldot} |
|
\global\def#{\normalhash} |
|
\global\def?{\normalquest} |
|
\global\def/{\normalslash} |
|
} |
|
|
|
% we put a little stretch before and after the breakable chars, to help |
|
% line breaking of long url's. The unequal skips make look better in |
|
% cmtt at least, especially for dots. |
|
\def\urefprestretch{\urefprebreak \hskip0pt plus.13em } |
|
\def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } |
|
% |
|
\def\urefcodeamp{\urefprestretch \&\urefpoststretch} |
|
\def\urefcodedot{\urefprestretch .\urefpoststretch} |
|
\def\urefcodehash{\urefprestretch \#\urefpoststretch} |
|
\def\urefcodequest{\urefprestretch ?\urefpoststretch} |
|
\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} |
|
{ |
|
\catcode`\/=\active |
|
\global\def\urefcodeslashfinish{% |
|
\urefprestretch \slashChar |
|
% Allow line break only after the final / in a sequence of |
|
% slashes, to avoid line break between the slashes in http://. |
|
\ifx\next/\else \urefpoststretch \fi |
|
} |
|
} |
|
|
|
% One more complication: by default we'll break after the special |
|
% characters, but some people like to break before the special chars, so |
|
% allow that. Also allow no breaking at all, for manual control. |
|
% |
|
\parseargdef\urefbreakstyle{% |
|
\def\txiarg{#1}% |
|
\ifx\txiarg\wordnone |
|
\def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} |
|
\else\ifx\txiarg\wordbefore |
|
\def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} |
|
\else\ifx\txiarg\wordafter |
|
\def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @urefbreakstyle setting `\txiarg'}% |
|
\fi\fi\fi |
|
} |
|
\def\wordafter{after} |
|
\def\wordbefore{before} |
|
\def\wordnone{none} |
|
|
|
\urefbreakstyle after |
|
|
% @url synonym for @uref, since that's how everyone uses it. |
% @url synonym for @uref, since that's how everyone uses it. |
% |
% |
\let\url=\uref |
\let\url=\uref |
Line 2784 end
|
Line 2707 end
|
\let\email=\uref |
\let\email=\uref |
\fi |
\fi |
|
|
|
% @kbd is like @code, except that if the argument is just one @key command, |
|
% then @kbd has no effect. |
|
\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}} |
|
|
|
% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), |
|
% `example' (@kbd uses ttsl only inside of @example and friends), |
|
% or `code' (@kbd uses normal tty font always). |
|
\parseargdef\kbdinputstyle{% |
|
\def\txiarg{#1}% |
|
\ifx\txiarg\worddistinct |
|
\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% |
|
\else\ifx\txiarg\wordexample |
|
\gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% |
|
\else\ifx\txiarg\wordcode |
|
\gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @kbdinputstyle setting `\txiarg'}% |
|
\fi\fi\fi |
|
} |
|
\def\worddistinct{distinct} |
|
\def\wordexample{example} |
|
\def\wordcode{code} |
|
|
|
% Default is `distinct'. |
|
\kbdinputstyle distinct |
|
|
|
\def\xkey{\key} |
|
\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% |
|
\ifx\one\xkey\ifx\threex\three \key{#2}% |
|
\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi |
|
\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi} |
|
|
|
% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. |
|
\let\indicateurl=\code |
|
\let\env=\code |
|
\let\command=\code |
|
|
|
% @clicksequence{File @click{} Open ...} |
|
\def\clicksequence#1{\begingroup #1\endgroup} |
|
|
|
% @clickstyle @arrow (by default) |
|
\parseargdef\clickstyle{\def\click{#1}} |
|
\def\click{\arrow} |
|
|
% Typeset a dimension, e.g., `in' or `pt'. The only reason for the |
% Typeset a dimension, e.g., `in' or `pt'. The only reason for the |
% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. |
% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. |
% |
% |
Line 2805 end
|
Line 2773 end
|
\ifx\temp\empty \else |
\ifx\temp\empty \else |
\space ({\unsepspaces \ignorespaces \temp \unskip})% |
\space ({\unsepspaces \ignorespaces \temp \unskip})% |
\fi |
\fi |
|
\null % reset \spacefactor=1000 |
} |
} |
|
|
% @abbr for "Comput. J." and the like. |
% @abbr for "Comput. J." and the like. |
Line 2817 end
|
Line 2786 end
|
\ifx\temp\empty \else |
\ifx\temp\empty \else |
\space ({\unsepspaces \ignorespaces \temp \unskip})% |
\space ({\unsepspaces \ignorespaces \temp \unskip})% |
\fi |
\fi |
|
\null % reset \spacefactor=1000 |
} |
} |
|
|
|
% @asis just yields its argument. Used with @table, for example. |
|
% |
|
\def\asis#1{#1} |
|
|
|
% @math outputs its argument in math mode. |
|
% |
|
% One complication: _ usually means subscripts, but it could also mean |
|
% an actual _ character, as in @math{@var{some_variable} + 1}. So make |
|
% _ active, and distinguish by seeing if the current family is \slfam, |
|
% which is what @var uses. |
|
{ |
|
\catcode`\_ = \active |
|
\gdef\mathunderscore{% |
|
\catcode`\_=\active |
|
\def_{\ifnum\fam=\slfam \_\else\sb\fi}% |
|
} |
|
} |
|
% Another complication: we want \\ (and @\) to output a math (or tt) \. |
|
% FYI, plain.tex uses \\ as a temporary control sequence (for no |
|
% particular reason), but this is not advertised and we don't care. |
|
% |
|
% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. |
|
\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} |
|
% |
|
\def\math{% |
|
\tex |
|
\mathunderscore |
|
\let\\ = \mathbackslash |
|
\mathactive |
|
% make the texinfo accent commands work in math mode |
|
\let\"=\ddot |
|
\let\'=\acute |
|
\let\==\bar |
|
\let\^=\hat |
|
\let\`=\grave |
|
\let\u=\breve |
|
\let\v=\check |
|
\let\~=\tilde |
|
\let\dotaccent=\dot |
|
$\finishmath |
|
} |
|
\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. |
|
|
|
% Some active characters (such as <) are spaced differently in math. |
|
% We have to reset their definitions in case the @math was an argument |
|
% to a command which sets the catcodes (such as @item or @section). |
|
% |
|
{ |
|
\catcode`^ = \active |
|
\catcode`< = \active |
|
\catcode`> = \active |
|
\catcode`+ = \active |
|
\catcode`' = \active |
|
\gdef\mathactive{% |
|
\let^ = \ptexhat |
|
\let< = \ptexless |
|
\let> = \ptexgtr |
|
\let+ = \ptexplus |
|
\let' = \ptexquoteright |
|
} |
|
} |
|
|
|
|
\message{glyphs,} |
\message{glyphs,} |
|
% and logos. |
|
|
|
% @@ prints an @. |
|
\def\@{\char64 } |
|
|
|
% Used to generate quoted braces. Unless we're in typewriter, use |
|
% \ecfont because the CM text fonts do not have braces, and we don't |
|
% want to switch into math. |
|
\def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} |
|
\def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} |
|
\let\{=\mylbrace |
|
\let\}=\myrbrace |
|
\begingroup |
|
% Definitions to produce \{ and \} commands for indices, |
|
% and @{ and @} for the aux/toc files. |
|
\catcode`\{ = \other \catcode`\} = \other |
|
\catcode`\[ = 1 \catcode`\] = 2 |
|
\catcode`\! = 0 \catcode`\\ = \other |
|
!gdef!lbracecmd[\{]% |
|
!gdef!rbracecmd[\}]% |
|
!gdef!lbraceatcmd[@{]% |
|
!gdef!rbraceatcmd[@}]% |
|
!endgroup |
|
|
|
% @comma{} to avoid , parsing problems. |
|
\let\comma = , |
|
|
|
% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent |
|
% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. |
|
\let\, = \ptexc |
|
\let\dotaccent = \ptexdot |
|
\def\ringaccent#1{{\accent23 #1}} |
|
\let\tieaccent = \ptext |
|
\let\ubaraccent = \ptexb |
|
\let\udotaccent = \d |
|
|
|
% Other special characters: @questiondown @exclamdown @ordf @ordm |
|
% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. |
|
\def\questiondown{?`} |
|
\def\exclamdown{!`} |
|
\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} |
|
\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} |
|
|
|
% Dotless i and dotless j, used for accents. |
|
\def\imacro{i} |
|
\def\jmacro{j} |
|
\def\dotless#1{% |
|
\def\temp{#1}% |
|
\ifx\temp\imacro \ifmmode\imath \else\ptexi \fi |
|
\else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi |
|
\else \errmessage{@dotless can be used only with i or j}% |
|
\fi\fi |
|
} |
|
|
|
% The \TeX{} logo, as in plain, but resetting the spacing so that a |
|
% period following counts as ending a sentence. (Idea found in latex.) |
|
% |
|
\edef\TeX{\TeX \spacefactor=1000 } |
|
|
|
% @LaTeX{} logo. Not quite the same results as the definition in |
|
% latex.ltx, since we use a different font for the raised A; it's most |
|
% convenient for us to use an explicitly smaller font, rather than using |
|
% the \scriptstyle font (since we don't reset \scriptstyle and |
|
% \scriptscriptstyle). |
|
% |
|
\def\LaTeX{% |
|
L\kern-.36em |
|
{\setbox0=\hbox{T}% |
|
\vbox to \ht0{\hbox{% |
|
\ifx\textnominalsize\xwordpt |
|
% for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. |
|
% Revert to plain's \scriptsize, which is 7pt. |
|
\count255=\the\fam $\fam\count255 \scriptstyle A$% |
|
\else |
|
% For 11pt, we can use our lllsize. |
|
\selectfonts\lllsize A% |
|
\fi |
|
}% |
|
\vss |
|
}}% |
|
\kern-.15em |
|
\TeX |
|
} |
|
|
|
% Some math mode symbols. |
|
\def\bullet{$\ptexbullet$} |
|
\def\geq{\ifmmode \ge\else $\ge$\fi} |
|
\def\leq{\ifmmode \le\else $\le$\fi} |
|
\def\minus{\ifmmode -\else $-$\fi} |
|
|
|
% @dots{} outputs an ellipsis using the current font. |
|
% We do .5em per period so that it has the same spacing in the cm |
|
% typewriter fonts as three actual period characters; on the other hand, |
|
% in other typewriter fonts three periods are wider than 1.5em. So do |
|
% whichever is larger. |
|
% |
|
\def\dots{% |
|
\leavevmode |
|
\setbox0=\hbox{...}% get width of three periods |
|
\ifdim\wd0 > 1.5em |
|
\dimen0 = \wd0 |
|
\else |
|
\dimen0 = 1.5em |
|
\fi |
|
\hbox to \dimen0{% |
|
\hskip 0pt plus.25fil |
|
.\hskip 0pt plus1fil |
|
.\hskip 0pt plus1fil |
|
.\hskip 0pt plus.5fil |
|
}% |
|
} |
|
|
|
% @enddots{} is an end-of-sentence ellipsis. |
|
% |
|
\def\enddots{% |
|
\dots |
|
\spacefactor=\endofsentencespacefactor |
|
} |
|
|
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. |
% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. |
% |
% |
% Since these characters are used in examples, they should be an even number of |
% Since these characters are used in examples, they should be an even number of |
Line 2842 end
|
Line 2992 end
|
{\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 \reducedsf error\kern-1.5pt} | \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} |
% |
% |
\setbox\errorbox=\hbox to \dimen0{\hfil |
\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. |
Line 2991 end
|
Line 3141 end
|
% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 |
% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 |
% so we'll define it if necessary. |
% so we'll define it if necessary. |
% |
% |
\ifx\Orb\undefined | \ifx\Orb\thisisundefined |
\def\Orb{\mathhexbox20D} |
\def\Orb{\mathhexbox20D} |
\fi |
\fi |
|
|
Line 3019 end
|
Line 3169 end
|
\newif\ifsetshortcontentsaftertitlepage |
\newif\ifsetshortcontentsaftertitlepage |
\let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue |
\let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue |
|
|
\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% | \parseargdef\shorttitlepage{% |
\endgroup\page\hbox{}\page} | \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% |
| \endgroup\page\hbox{}\page} |
|
|
\envdef\titlepage{% |
\envdef\titlepage{% |
% Open one extra group, as we want to close it in the middle of \Etitlepage. |
% Open one extra group, as we want to close it in the middle of \Etitlepage. |
Line 3080 end
|
Line 3231 end
|
\finishedtitlepagetrue |
\finishedtitlepagetrue |
} |
} |
|
|
%%% Macros to be used within @titlepage: | % Macros to be used within @titlepage: |
|
|
\let\subtitlerm=\tenrm |
\let\subtitlerm=\tenrm |
\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} |
\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} |
Line 3113 end
|
Line 3264 end
|
} |
} |
|
|
|
|
%%% Set up page headings and footings. | % Set up page headings and footings. |
|
|
\let\thispage=\folio |
\let\thispage=\folio |
|
|
Line 3207 end
|
Line 3358 end
|
|
|
\def\headings #1 {\csname HEADINGS#1\endcsname} |
\def\headings #1 {\csname HEADINGS#1\endcsname} |
|
|
\def\HEADINGSoff{% | \def\headingsoff{% non-global headings elimination |
\global\evenheadline={\hfil} \global\evenfootline={\hfil} | \evenheadline={\hfil}\evenfootline={\hfil}% |
\global\oddheadline={\hfil} \global\oddfootline={\hfil}} | \oddheadline={\hfil}\oddfootline={\hfil}% |
\HEADINGSoff | } |
| |
| \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting |
| \HEADINGSoff % it's the default |
| |
% When we turn headings on, set the page number to 1. |
% When we turn headings on, set the page number to 1. |
% For double-sided printing, put current file name in lower left corner, |
% For double-sided printing, put current file name in lower left corner, |
% chapter name on inside top of right hand pages, document |
% chapter name on inside top of right hand pages, document |
Line 3261 end
|
Line 3416 end
|
% This 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 |
% 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). |
% up a different format (e.g., txi-cs.tex does this). |
\ifx\today\undefined | \ifx\today\thisisundefined |
\def\today{% |
\def\today{% |
\number\day\space |
\number\day\space |
\ifcase\month |
\ifcase\month |
Line 3322 end
|
Line 3477 end
|
\begingroup |
\begingroup |
\advance\leftskip by-\tableindent |
\advance\leftskip by-\tableindent |
\advance\hsize by\tableindent |
\advance\hsize by\tableindent |
\advance\rightskip by0pt plus1fil | \advance\rightskip by0pt plus1fil\relax |
\leavevmode\unhbox0\par |
\leavevmode\unhbox0\par |
\endgroup |
\endgroup |
% |
% |
Line 3808 end
|
Line 3963 end
|
\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip |
\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip |
\global\advance\multitablelinespace by-\ht0 |
\global\advance\multitablelinespace by-\ht0 |
\fi |
\fi |
%% Test to see if parskip is larger than space between lines of | % Test to see if parskip is larger than space between lines of |
%% table. If not, do nothing. | % table. If not, do nothing. |
%% If so, set to same dimension as multitablelinespace. | % 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 |
%% than skip between lines in the table. | % than skip between lines in the table. |
\fi% |
\fi% |
\ifdim\multitableparskip=0pt |
\ifdim\multitableparskip=0pt |
\global\multitableparskip=\multitablelinespace |
\global\multitableparskip=\multitablelinespace |
\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller | \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller |
%% than skip between lines in the table. | % than skip between lines in the table. |
\fi} |
\fi} |
|
|
|
|
Line 4134 end
|
Line 4289 end
|
\def\@{@}% change to @@ when we switch to @ as escape char in index files. |
\def\@{@}% change to @@ when we switch to @ as escape char in index files. |
\def\ {\realbackslash\space }% |
\def\ {\realbackslash\space }% |
% |
% |
% Need these in case \tex is in effect and \{ is a \delimiter again. | % Need these unexpandable (because we define \tt as a dummy) |
% But can't use \lbracecmd and \rbracecmd because texindex assumes | % definitions when @{ or @} appear in index entry text. Also, more |
% braces and backslashes are used only as delimiters. | % complicated, when \tex is in effect and \{ is a \delimiter again. |
\let\{ = \mylbrace | % We can't use \lbracecmd and \rbracecmd because texindex assumes |
\let\} = \myrbrace | % braces and backslashes are used only as delimiters. Perhaps we |
| % should define @lbrace and @rbrace commands a la @comma. |
| \def\{{{\tt\char123}}% |
| \def\}{{\tt\char125}}% |
% |
% |
% I don't entirely understand this, but when an index entry is |
% I don't entirely understand this, but when an index entry is |
% generated from a macro call, the \endinput which \scanmacro inserts |
% generated from a macro call, the \endinput which \scanmacro inserts |
Line 4191 end
|
Line 4349 end
|
\def\commondummies{% |
\def\commondummies{% |
% |
% |
% \definedummyword defines \#1 as \string\#1\space, thus effectively |
% \definedummyword defines \#1 as \string\#1\space, thus effectively |
% preventing its expansion. This is used only for control% words, | % preventing its expansion. This is used only for control words, |
% not control letters, because the \space would be incorrect for |
% not control letters, because the \space would be incorrect for |
% control characters, but is needed to separate the control word |
% control characters, but is needed to separate the control word |
% from whatever follows. |
% from whatever follows. |
Line 4210 end
|
Line 4368 end
|
\commondummiesnofonts |
\commondummiesnofonts |
% |
% |
\definedummyletter\_% |
\definedummyletter\_% |
|
\definedummyletter\-% |
% |
% |
% Non-English letters. |
% Non-English letters. |
\definedummyword\AA |
\definedummyword\AA |
Line 4246 end
|
Line 4405 end
|
\definedummyword\TeX |
\definedummyword\TeX |
% |
% |
% Assorted special characters. |
% Assorted special characters. |
|
\definedummyword\arrow |
\definedummyword\bullet |
\definedummyword\bullet |
\definedummyword\comma |
\definedummyword\comma |
\definedummyword\copyright |
\definedummyword\copyright |
\definedummyword\registeredsymbol |
\definedummyword\registeredsymbol |
\definedummyword\dots |
\definedummyword\dots |
\definedummyword\enddots |
\definedummyword\enddots |
|
\definedummyword\entrybreak |
\definedummyword\equiv |
\definedummyword\equiv |
\definedummyword\error |
\definedummyword\error |
\definedummyword\euro |
\definedummyword\euro |
|
\definedummyword\expansion |
|
\definedummyword\geq |
\definedummyword\guillemetleft |
\definedummyword\guillemetleft |
\definedummyword\guillemetright |
\definedummyword\guillemetright |
\definedummyword\guilsinglleft |
\definedummyword\guilsinglleft |
\definedummyword\guilsinglright |
\definedummyword\guilsinglright |
\definedummyword\expansion | \definedummyword\leq |
\definedummyword\minus |
\definedummyword\minus |
\definedummyword\ogonek |
\definedummyword\ogonek |
\definedummyword\pounds |
\definedummyword\pounds |
Line 4316 end
|
Line 4479 end
|
\definedummyword\b |
\definedummyword\b |
\definedummyword\i |
\definedummyword\i |
\definedummyword\r |
\definedummyword\r |
|
\definedummyword\sansserif |
\definedummyword\sc |
\definedummyword\sc |
|
\definedummyword\slanted |
\definedummyword\t |
\definedummyword\t |
% |
% |
% Commands that take arguments. |
% Commands that take arguments. |
Line 4325 end
|
Line 4490 end
|
\definedummyword\code |
\definedummyword\code |
\definedummyword\command |
\definedummyword\command |
\definedummyword\dfn |
\definedummyword\dfn |
|
\definedummyword\dmn |
\definedummyword\email |
\definedummyword\email |
\definedummyword\emph |
\definedummyword\emph |
\definedummyword\env |
\definedummyword\env |
\definedummyword\file |
\definedummyword\file |
|
\definedummyword\indicateurl |
\definedummyword\kbd |
\definedummyword\kbd |
\definedummyword\key |
\definedummyword\key |
\definedummyword\math |
\definedummyword\math |
Line 4356 end
|
Line 4523 end
|
\def\definedummyaccent##1{\let##1\asis}% |
\def\definedummyaccent##1{\let##1\asis}% |
% We can just ignore other control letters. |
% We can just ignore other control letters. |
\def\definedummyletter##1{\let##1\empty}% |
\def\definedummyletter##1{\let##1\empty}% |
% Hopefully, all control words can become @asis. | % All control words become @asis by default; overrides below. |
\let\definedummyword\definedummyaccent |
\let\definedummyword\definedummyaccent |
% |
% |
\commondummiesnofonts |
\commondummiesnofonts |
Line 4368 end
|
Line 4535 end
|
% |
% |
\def\ { }% |
\def\ { }% |
\def\@{@}% |
\def\@{@}% |
% how to handle braces? |
|
\def\_{\normalunderscore}% |
\def\_{\normalunderscore}% |
|
\def\-{}% @- shouldn't affect sorting |
% |
% |
|
% Unfortunately, texindex is not prepared to handle braces in the |
|
% content at all. So for index sorting, we map @{ and @} to strings |
|
% starting with |, since that ASCII character is between ASCII { and }. |
|
\def\{{|a}% |
|
\def\}{|b}% |
|
% |
% Non-English letters. |
% Non-English letters. |
\def\AA{AA}% |
\def\AA{AA}% |
\def\AE{AE}% |
\def\AE{AE}% |
Line 4397 end
|
Line 4570 end
|
% |
% |
% Assorted special characters. |
% Assorted special characters. |
% (The following {} will end up in the sort string, but that's ok.) |
% (The following {} will end up in the sort string, but that's ok.) |
|
\def\arrow{->}% |
\def\bullet{bullet}% |
\def\bullet{bullet}% |
\def\comma{,}% |
\def\comma{,}% |
\def\copyright{copyright}% |
\def\copyright{copyright}% |
Line 4406 end
|
Line 4580 end
|
\def\error{error}% |
\def\error{error}% |
\def\euro{euro}% |
\def\euro{euro}% |
\def\expansion{==>}% |
\def\expansion{==>}% |
|
\def\geq{>=}% |
\def\guillemetleft{<<}% |
\def\guillemetleft{<<}% |
\def\guillemetright{>>}% |
\def\guillemetright{>>}% |
\def\guilsinglleft{<}% |
\def\guilsinglleft{<}% |
\def\guilsinglright{>}% |
\def\guilsinglright{>}% |
|
\def\leq{<=}% |
\def\minus{-}% |
\def\minus{-}% |
\def\point{.}% |
\def\point{.}% |
\def\pounds{pounds}% |
\def\pounds{pounds}% |
Line 4424 end
|
Line 4600 end
|
\def\result{=>}% |
\def\result{=>}% |
\def\textdegree{o}% |
\def\textdegree{o}% |
% |
% |
|
\expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax |
|
\else \indexlquoteignore \fi |
|
% |
% We need to get rid of all macros, leaving only the arguments (if present). |
% We need to get rid of all macros, leaving only the arguments (if present). |
% Of course this is not nearly correct, but it is the best we can do for now. |
% Of course this is not nearly correct, but it is the best we can do for now. |
% makeinfo does not expand macros in the argument to @deffn, which ends up |
% makeinfo does not expand macros in the argument to @deffn, which ends up |
Line 4437 end
|
Line 4616 end
|
\macrolist |
\macrolist |
} |
} |
|
|
|
% Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us |
|
% ignore left quotes in the sort term. |
|
{\catcode`\`=\active |
|
\gdef\indexlquoteignore{\let`=\empty}} |
|
|
\let\indexbackslash=0 %overridden during \printindex. |
\let\indexbackslash=0 %overridden during \printindex. |
\let\SETmarginindex=\relax % put index entries in margin (undocumented)? |
\let\SETmarginindex=\relax % put index entries in margin (undocumented)? |
|
|
Line 4694 end
|
Line 4878 end
|
% But this freezes the catcodes in the argument, and can cause problems to |
% But this freezes the catcodes in the argument, and can cause problems to |
% @code, which sets - active. This problem was fixed by a kludge--- |
% @code, which sets - active. This problem was fixed by a kludge--- |
% ``-'' was active throughout whole index, but this isn't really right. |
% ``-'' was active throughout whole index, but this isn't really right. |
% |
|
% The right solution is to prevent \entry from swallowing the whole text. |
% The right solution is to prevent \entry from swallowing the whole text. |
% --kasal, 21nov03 |
% --kasal, 21nov03 |
\def\entry{% |
\def\entry{% |
Line 4731 end
|
Line 4914 end
|
% columns. |
% columns. |
\vskip 0pt plus1pt |
\vskip 0pt plus1pt |
% |
% |
|
% When reading the text of entry, convert explicit line breaks |
|
% from @* into spaces. The user might give these in long section |
|
% titles, for instance. |
|
\def\*{\unskip\space\ignorespaces}% |
|
\def\entrybreak{\hfil\break}% |
|
% |
% Swallow the left brace of the text (first parameter): |
% Swallow the left brace of the text (first parameter): |
\afterassignment\doentry |
\afterassignment\doentry |
\let\temp = |
\let\temp = |
} |
} |
|
\def\entrybreak{\unskip\space\ignorespaces}% |
\def\doentry{% |
\def\doentry{% |
\bgroup % Instead of the swallowed brace. |
\bgroup % Instead of the swallowed brace. |
\noindent |
\noindent |
Line 4967 end
|
Line 5157 end
|
\message{sectioning,} |
\message{sectioning,} |
% Chapters, sections, etc. |
% Chapters, sections, etc. |
|
|
% \unnumberedno is an oxymoron, of course. But we count the unnumbered | % Let's start with @part. |
| \outer\parseargdef\part{\partzzz{#1}} |
| \def\partzzz#1{% |
| \chapoddpage |
| \null |
| \vskip.3\vsize % move it down on the page a bit |
| \begingroup |
| \noindent \titlefonts\rmisbold #1\par % the text |
| \let\lastnode=\empty % no node to associate with |
| \writetocentry{part}{#1}{}% but put it in the toc |
| \headingsoff % no headline or footline on the part page |
| \chapoddpage |
| \endgroup |
| } |
| |
| % \unnumberedno is an oxymoron. But we count the unnumbered |
% sections so that we can refer to them unambiguously in the pdf |
% sections so that we can refer to them unambiguously in the pdf |
% outlines by their "section number". We avoid collisions with chapter |
% outlines by their "section number". We avoid collisions with chapter |
% numbers by starting them at 10000. (If a document ever has 10000 |
% numbers by starting them at 10000. (If a document ever has 10000 |
Line 5046 end
|
Line 5251 end
|
\chardef\maxseclevel = 3 |
\chardef\maxseclevel = 3 |
% |
% |
% A numbered section within an unnumbered changes to unnumbered too. |
% A numbered section within an unnumbered changes to unnumbered too. |
% To achive this, remember the "biggest" unnum. sec. we are currently in: | % To achieve this, remember the "biggest" unnum. sec. we are currently in: |
\chardef\unmlevel = \maxseclevel | \chardef\unnlevel = \maxseclevel |
% |
% |
% Trace whether the current chapter is an appendix or not: |
% Trace whether the current chapter is an appendix or not: |
% \chapheadtype is "N" or "A", unnumbered chapters are ignored. |
% \chapheadtype is "N" or "A", unnumbered chapters are ignored. |
Line 5072 end
|
Line 5277 end
|
% The heading type: |
% The heading type: |
\def\headtype{#1}% |
\def\headtype{#1}% |
\if \headtype U% |
\if \headtype U% |
\ifnum \absseclevel < \unmlevel | \ifnum \absseclevel < \unnlevel |
\chardef\unmlevel = \absseclevel | \chardef\unnlevel = \absseclevel |
\fi |
\fi |
\else |
\else |
% Check for appendix sections: |
% Check for appendix sections: |
Line 5085 end
|
Line 5290 end
|
\fi\fi |
\fi\fi |
\fi |
\fi |
% Check for numbered within unnumbered: |
% Check for numbered within unnumbered: |
\ifnum \absseclevel > \unmlevel | \ifnum \absseclevel > \unnlevel |
\def\headtype{U}% |
\def\headtype{U}% |
\else |
\else |
\chardef\unmlevel = 3 | \chardef\unnlevel = 3 |
\fi |
\fi |
\fi |
\fi |
% Now print the heading: |
% Now print the heading: |
Line 5174 end
|
Line 5379 end
|
\global\let\subsubsection = \appendixsubsubsec |
\global\let\subsubsection = \appendixsubsubsec |
} |
} |
|
|
\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz | % normally unnmhead0 calls unnumberedzzz: |
| \outer\parseargdef\unnumbered{\unnmhead0{#1}} |
\def\unnumberedzzz#1{% |
\def\unnumberedzzz#1{% |
\global\secno=0 \global\subsecno=0 \global\subsubsecno=0 |
\global\secno=0 \global\subsecno=0 \global\subsubsecno=0 |
\global\advance\unnumberedno by 1 |
\global\advance\unnumberedno by 1 |
Line 5218 end
|
Line 5424 end
|
\let\top\unnumbered |
\let\top\unnumbered |
|
|
% Sections. |
% Sections. |
|
% |
\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz |
\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz |
\def\seczzz#1{% |
\def\seczzz#1{% |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% |
\sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% |
} |
} |
|
|
\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz | % normally calls appendixsectionzzz: |
| \outer\parseargdef\appendixsection{\apphead1{#1}} |
\def\appendixsectionzzz#1{% |
\def\appendixsectionzzz#1{% |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% |
\sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% |
} |
} |
\let\appendixsec\appendixsection |
\let\appendixsec\appendixsection |
|
|
\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz | % normally calls unnumberedseczzz: |
| \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} |
\def\unnumberedseczzz#1{% |
\def\unnumberedseczzz#1{% |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% |
\sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% |
} |
} |
|
|
% Subsections. |
% Subsections. |
\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz | % |
| % normally calls numberedsubseczzz: |
| \outer\parseargdef\numberedsubsec{\numhead2{#1}} |
\def\numberedsubseczzz#1{% |
\def\numberedsubseczzz#1{% |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% |
\sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% |
} |
} |
|
|
\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz | % normally calls appendixsubseczzz: |
| \outer\parseargdef\appendixsubsec{\apphead2{#1}} |
\def\appendixsubseczzz#1{% |
\def\appendixsubseczzz#1{% |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\sectionheading{#1}{subsec}{Yappendix}% |
\sectionheading{#1}{subsec}{Yappendix}% |
{\appendixletter.\the\secno.\the\subsecno}% |
{\appendixletter.\the\secno.\the\subsecno}% |
} |
} |
|
|
\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz | % normally calls unnumberedsubseczzz: |
| \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} |
\def\unnumberedsubseczzz#1{% |
\def\unnumberedsubseczzz#1{% |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\sectionheading{#1}{subsec}{Ynothing}% |
\sectionheading{#1}{subsec}{Ynothing}% |
Line 5259 end
|
Line 5472 end
|
} |
} |
|
|
% Subsubsections. |
% Subsubsections. |
\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz | % |
| % normally numberedsubsubseczzz: |
| \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} |
\def\numberedsubsubseczzz#1{% |
\def\numberedsubsubseczzz#1{% |
\global\advance\subsubsecno by 1 |
\global\advance\subsubsecno by 1 |
\sectionheading{#1}{subsubsec}{Ynumbered}% |
\sectionheading{#1}{subsubsec}{Ynumbered}% |
{\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% |
{\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% |
} |
} |
|
|
\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz | % normally appendixsubsubseczzz: |
| \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} |
\def\appendixsubsubseczzz#1{% |
\def\appendixsubsubseczzz#1{% |
\global\advance\subsubsecno by 1 |
\global\advance\subsubsecno by 1 |
\sectionheading{#1}{subsubsec}{Yappendix}% |
\sectionheading{#1}{subsubsec}{Yappendix}% |
{\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% |
{\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% |
} |
} |
|
|
\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz | % normally unnumberedsubsubseczzz: |
| \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} |
\def\unnumberedsubsubseczzz#1{% |
\def\unnumberedsubsubseczzz#1{% |
\global\advance\subsubsecno by 1 |
\global\advance\subsubsecno by 1 |
\sectionheading{#1}{subsubsec}{Ynothing}% |
\sectionheading{#1}{subsubsec}{Ynothing}% |
Line 5323 end
|
Line 5540 end
|
% (including whitespace, linebreaking, etc. around it), |
% (including whitespace, linebreaking, etc. around it), |
% given all the information in convenient, parsed form. |
% given all the information in convenient, parsed form. |
|
|
%%% Args are the skip and penalty (usually negative) | % Args are the skip and penalty (usually negative) |
\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} |
\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} |
|
|
%%% Define plain chapter starts, and page on/off switching for it |
|
% Parameter controlling skip before chapter headings (if needed) |
% Parameter controlling skip before chapter headings (if needed) |
|
|
\newskip\chapheadingskip |
\newskip\chapheadingskip |
|
|
|
% Define plain chapter starts, and page on/off switching for it. |
\def\chapbreak{\dobreak \chapheadingskip {-4000}} |
\def\chapbreak{\dobreak \chapheadingskip {-4000}} |
\def\chappager{\par\vfill\supereject} |
\def\chappager{\par\vfill\supereject} |
% Because \domark is called before \chapoddpage, the filler page will |
% Because \domark is called before \chapoddpage, the filler page will |
Line 5340 end
|
Line 5556 end
|
\chappager |
\chappager |
\ifodd\pageno \else |
\ifodd\pageno \else |
\begingroup |
\begingroup |
\evenheadline={\hfil}\evenfootline={\hfil}% | \headingsoff |
\oddheadline={\hfil}\oddfootline={\hfil}% | \null |
\hbox to 0pt{}% | |
\chappager |
\chappager |
\endgroup |
\endgroup |
\fi |
\fi |
Line 5534 end
|
Line 5749 end
|
% |
% |
\def\sectionheading#1#2#3#4{% |
\def\sectionheading#1#2#3#4{% |
{% |
{% |
|
\checkenv{}% should not be in an environment. |
|
% |
% Switch to the right set of fonts. |
% Switch to the right set of fonts. |
\csname #2fonts\endcsname \rmisbold |
\csname #2fonts\endcsname \rmisbold |
% |
% |
Line 5651 end
|
Line 5868 end
|
% This is purely so the last item on the list is a known \penalty > |
% This is purely so the last item on the list is a known \penalty > |
% 10000. This is so \startdefun can avoid allowing breakpoints after |
% 10000. This is so \startdefun can avoid allowing breakpoints after |
% section headings. Otherwise, it would insert a valid breakpoint between: |
% section headings. Otherwise, it would insert a valid breakpoint between: |
% |
|
% @section sec-whatever |
% @section sec-whatever |
% @deffn def-whatever |
% @deffn def-whatever |
\penalty 10001 |
\penalty 10001 |
Line 5785 end
|
Line 6001 end
|
\def\summarycontents{% |
\def\summarycontents{% |
\startcontents{\putwordShortTOC}% |
\startcontents{\putwordShortTOC}% |
% |
% |
|
\let\partentry = \shortpartentry |
\let\numchapentry = \shortchapentry |
\let\numchapentry = \shortchapentry |
\let\appentry = \shortchapentry |
\let\appentry = \shortchapentry |
\let\unnchapentry = \shortunnchapentry |
\let\unnchapentry = \shortunnchapentry |
Line 5840 end
|
Line 6057 end
|
% 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, ... |
|
|
|
% Parts, in the main contents. Replace the part number, which doesn't |
|
% exist, with an empty box. Let's hope all the numbers have the same width. |
|
% Also ignore the page number, which is conventionally not printed. |
|
\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} |
|
\def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} |
|
% |
|
% Parts, in the short toc. |
|
\def\shortpartentry#1#2#3#4{% |
|
\penalty-300 |
|
\vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip |
|
\shortchapentry{{\bf #1}}{\numeralbox}{}{}% |
|
} |
|
|
% Chapters, in the main contents. |
% Chapters, in the main contents. |
\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} |
\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} |
% |
% |
Line 5929 end
|
Line 6159 end
|
\message{environments,} |
\message{environments,} |
% @foo ... @end foo. |
% @foo ... @end foo. |
|
|
% @tex ... @end tex escapes into raw Tex temporarily. | % @tex ... @end tex escapes into raw TeX temporarily. |
% One exception: @ is still an escape character, so that @end tex works. |
% One exception: @ is still an escape character, so that @end tex works. |
% But \@ or @@ will get a plain tex @ character. | % But \@ or @@ will get a plain @ character. |
|
|
\envdef\tex{% |
\envdef\tex{% |
\setupmarkupstyle{tex}% |
\setupmarkupstyle{tex}% |
Line 5948 end
|
Line 6178 end
|
\catcode`\'=\other |
\catcode`\'=\other |
\escapechar=`\\ |
\escapechar=`\\ |
% |
% |
|
% ' is active in math mode (mathcode"8000). So reset it, and all our |
|
% other math active characters (just in case), to plain's definitions. |
|
\mathactive |
|
% |
\let\b=\ptexb |
\let\b=\ptexb |
\let\bullet=\ptexbullet |
\let\bullet=\ptexbullet |
\let\c=\ptexc |
\let\c=\ptexc |
Line 6051 end
|
Line 6285 end
|
\normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip |
\normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip |
% Flag to tell @lisp, etc., not to narrow margin. |
% Flag to tell @lisp, etc., not to narrow margin. |
\let\nonarrowing = t% |
\let\nonarrowing = t% |
|
% |
|
% If this cartouche directly follows a sectioning command, we need the |
|
% \parskip glue (backspaced over by default) or the cartouche can |
|
% collide with the section heading. |
|
\ifnum\lastpenalty>10000 \vskip\parskip \fi |
|
% |
\vbox\bgroup |
\vbox\bgroup |
\baselineskip=0pt\parskip=0pt\lineskip=0pt |
\baselineskip=0pt\parskip=0pt\lineskip=0pt |
\carttop |
\carttop |
Line 6064 end
|
Line 6304 end
|
\lineskip=\normlskip |
\lineskip=\normlskip |
\parskip=\normpskip |
\parskip=\normpskip |
\vskip -\parskip |
\vskip -\parskip |
\comment % For explanation, see the end of \def\group. | \comment % For explanation, see the end of def\group. |
} |
} |
\def\Ecartouche{% |
\def\Ecartouche{% |
\ifhmode\par\fi |
\ifhmode\par\fi |
Line 6150 end
|
Line 6390 end
|
} |
} |
|
|
% We often define two environments, @foo and @smallfoo. |
% We often define two environments, @foo and @smallfoo. |
% Let's do it by one command: | % Let's do it in one command. #1 is the env name, #2 the definition. |
\def\makedispenv #1#2{ | \def\makedispenvdef#1#2{% |
\expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} | \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% |
\expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} | \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% |
\expandafter\let\csname E#1\endcsname \afterenvbreak |
\expandafter\let\csname E#1\endcsname \afterenvbreak |
\expandafter\let\csname Esmall#1\endcsname \afterenvbreak |
\expandafter\let\csname Esmall#1\endcsname \afterenvbreak |
} |
} |
|
|
% Define two synonyms: | % Define two environment synonyms (#1 and #2) for an environment. |
\def\maketwodispenvs #1#2#3{ | \def\maketwodispenvdef#1#2#3{% |
\makedispenv{#1}{#3} | \makedispenvdef{#1}{#3}% |
\makedispenv{#2}{#3} | \makedispenvdef{#2}{#3}% |
} |
} |
|
|
% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. |
|
% |
% |
|
% @lisp: indented, narrowed, typewriter font; |
|
% @example: same as @lisp. |
|
% |
% @smallexample and @smalllisp: use smaller fonts. |
% @smallexample and @smalllisp: use smaller fonts. |
% Originally contributed by Pavel@xerox. |
% Originally contributed by Pavel@xerox. |
% |
% |
\maketwodispenvs {lisp}{example}{% | \maketwodispenvdef{lisp}{example}{% |
\nonfillstart |
\nonfillstart |
\tt\setupmarkupstyle{example}% |
\tt\setupmarkupstyle{example}% |
\let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. |
\let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. |
\gobble % eat return | \gobble % eat return |
} |
} |
% @display/@smalldisplay: same as @lisp except keep current font. |
% @display/@smalldisplay: same as @lisp except keep current font. |
% |
% |
\makedispenv {display}{% | \makedispenvdef{display}{% |
\nonfillstart |
\nonfillstart |
\gobble |
\gobble |
} |
} |
|
|
% @format/@smallformat: same as @display except don't narrow margins. |
% @format/@smallformat: same as @display except don't narrow margins. |
% |
% |
\makedispenv{format}{% | \makedispenvdef{format}{% |
\let\nonarrowing = t% |
\let\nonarrowing = t% |
\nonfillstart |
\nonfillstart |
\gobble |
\gobble |
Line 6203 end
|
Line 6444 end
|
\envdef\flushright{% |
\envdef\flushright{% |
\let\nonarrowing = t% |
\let\nonarrowing = t% |
\nonfillstart |
\nonfillstart |
\advance\leftskip by 0pt plus 1fill | \advance\leftskip by 0pt plus 1fill\relax |
\gobble |
\gobble |
} |
} |
\let\Eflushright = \afterenvbreak |
\let\Eflushright = \afterenvbreak |
Line 6238 end
|
Line 6479 end
|
% we're doing normal filling. So, when using \aboveenvbreak and |
% we're doing normal filling. So, when using \aboveenvbreak and |
% \afterenvbreak, temporarily make \parskip 0. |
% \afterenvbreak, temporarily make \parskip 0. |
% |
% |
|
\makedispenvdef{quotation}{\quotationstart} |
|
% |
\def\quotationstart{% |
\def\quotationstart{% |
{\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip |
{\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip |
\parindent=0pt |
\parindent=0pt |
Line 6253 end
|
Line 6496 end
|
\parsearg\quotationlabel |
\parsearg\quotationlabel |
} |
} |
|
|
\envdef\quotation{% |
|
\setnormaldispenv |
|
\quotationstart |
|
} |
|
|
|
\envdef\smallquotation{% |
|
\setsmalldispenv |
|
\quotationstart |
|
} |
|
\let\Esmallquotation = \Equotation |
|
|
|
% We have retained a nonzero parskip for the environment, since we're |
% We have retained a nonzero parskip for the environment, since we're |
% doing normal filling. |
% doing normal filling. |
% |
% |
\def\Equotation{% |
\def\Equotation{% |
\par |
\par |
\ifx\quotationauthor\undefined\else | \ifx\quotationauthor\thisisundefined\else |
% indent a bit. |
% indent a bit. |
\leftline{\kern 2\leftskip \sl ---\quotationauthor}% |
\leftline{\kern 2\leftskip \sl ---\quotationauthor}% |
\fi |
\fi |
{\parskip=0pt \afterenvbreak}% |
{\parskip=0pt \afterenvbreak}% |
} |
} |
|
\def\Esmallquotation{\Equotation} |
|
|
% If we're given an argument, typeset it in bold with a colon after. |
% If we're given an argument, typeset it in bold with a colon after. |
\def\quotationlabel#1{% |
\def\quotationlabel#1{% |
Line 6331 end
|
Line 6564 end
|
|
|
% Setup for the @verbatim environment |
% Setup for the @verbatim environment |
% |
% |
% Real tab expansion | % Real tab expansion. |
\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount |
\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount |
% |
% |
\def\starttabbox{\setbox0=\hbox\bgroup} | % We typeset each line of the verbatim in an \hbox, so we can handle |
| % tabs. The \global is in case the verbatim line starts with an accent, |
| % or some other command that starts with a begin-group. Otherwise, the |
| % entire \verbbox would disappear at the corresponding end-group, before |
| % it is typeset. Meanwhile, we can't have nested verbatim commands |
| % (can we?), so the \global won't be overwriting itself. |
| \newbox\verbbox |
| \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} |
% |
% |
\begingroup |
\begingroup |
\catcode`\^^I=\active |
\catcode`\^^I=\active |
\gdef\tabexpand{% |
\gdef\tabexpand{% |
\catcode`\^^I=\active |
\catcode`\^^I=\active |
\def^^I{\leavevmode\egroup |
\def^^I{\leavevmode\egroup |
\dimen0=\wd0 % the width so far, or since the previous tab | \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab |
\divide\dimen0 by\tabw | \divide\dimen\verbbox by\tabw |
\multiply\dimen0 by\tabw % compute previous multiple of \tabw | \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw |
\advance\dimen0 by\tabw % advance to next multiple of \tabw | \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw |
\wd0=\dimen0 \box0 \starttabbox | \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox |
}% |
}% |
} |
} |
\endgroup |
\endgroup |
Line 6354 end
|
Line 6594 end
|
\def\setupverbatim{% |
\def\setupverbatim{% |
\let\nonarrowing = t% |
\let\nonarrowing = t% |
\nonfillstart |
\nonfillstart |
% Easiest (and conventionally used) font for verbatim | \tt % easiest (and conventionally used) font for verbatim |
\tt | % The \leavevmode here is for blank lines. Otherwise, we would |
\def\par{\leavevmode\egroup\box0\endgraf}% | % never \starttabox and the \egroup would end verbatim mode. |
| \def\par{\leavevmode\egroup\box\verbbox\endgraf}% |
\tabexpand |
\tabexpand |
\setupmarkupstyle{verbatim}% |
\setupmarkupstyle{verbatim}% |
% Respect line breaks, |
% Respect line breaks, |
% print special symbols as themselves, and |
% print special symbols as themselves, and |
% make each space count | % make each space count. |
% must do in this order: | % Must do in this order: |
\obeylines \uncatcodespecials \sepspaces |
\obeylines \uncatcodespecials \sepspaces |
\everypar{\starttabbox}% |
\everypar{\starttabbox}% |
} |
} |
Line 6419 end
|
Line 6660 end
|
\makevalueexpandable |
\makevalueexpandable |
\setupverbatim |
\setupverbatim |
\indexnofonts % Allow `@@' and other weird things in file names. |
\indexnofonts % Allow `@@' and other weird things in file names. |
|
\wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% |
\input #1 |
\input #1 |
\afterenvbreak |
\afterenvbreak |
}% |
}% |
Line 6468 end
|
Line 6710 end
|
% commands also insert a nobreak penalty, and we don't want to allow |
% commands also insert a nobreak penalty, and we don't want to allow |
% a break between a section heading and a defun. |
% a break between a section heading and a defun. |
% |
% |
% As a minor refinement, we avoid "club" headers by signalling | % As a further refinement, we avoid "club" headers by signalling |
% with penalty of 10003 after the very first @deffn in the |
% with penalty of 10003 after the very first @deffn in the |
% sequence (see above), and penalty of 10002 after any following |
% sequence (see above), and penalty of 10002 after any following |
% @def command. |
% @def command. |
Line 6505 end
|
Line 6747 end
|
#1#2 \endheader |
#1#2 \endheader |
% common ending: |
% common ending: |
\interlinepenalty = 10000 |
\interlinepenalty = 10000 |
\advance\rightskip by 0pt plus 1fil | \advance\rightskip by 0pt plus 1fil\relax |
\endgraf |
\endgraf |
\nobreak\vskip -\parskip |
\nobreak\vskip -\parskip |
\penalty\defunpenalty % signal to \startdefun and \dodefunx |
\penalty\defunpenalty % signal to \startdefun and \dodefunx |
Line 6535 end
|
Line 6777 end
|
\def\domakedefun#1#2#3{% |
\def\domakedefun#1#2#3{% |
\envdef#1{% |
\envdef#1{% |
\startdefun |
\startdefun |
|
\doingtypefnfalse % distinguish typed functions from all else |
\parseargusing\activeparens{\printdefunline#3}% |
\parseargusing\activeparens{\printdefunline#3}% |
}% |
}% |
\def#2{\dodefunx#1}% |
\def#2{\dodefunx#1}% |
\def#3% |
\def#3% |
} |
} |
|
|
%%% Untyped functions: | \newif\ifdoingtypefn % doing typed function? |
| \newif\ifrettypeownline % typeset return type on its own line? |
|
|
|
% @deftypefnnewline on|off says whether the return type of typed functions |
|
% are printed on their own line. This affects @deftypefn, @deftypefun, |
|
% @deftypeop, and @deftypemethod. |
|
% |
|
\parseargdef\deftypefnnewline{% |
|
\def\temp{#1}% |
|
\ifx\temp\onword |
|
\expandafter\let\csname SETtxideftypefnnl\endcsname |
|
= \empty |
|
\else\ifx\temp\offword |
|
\expandafter\let\csname SETtxideftypefnnl\endcsname |
|
= \relax |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @txideftypefnnl value `\temp', |
|
must be on|off}% |
|
\fi\fi |
|
} |
|
|
|
% Untyped functions: |
|
|
% @deffn category name args |
% @deffn category name args |
\makedefun{deffn}{\deffngeneral{}} |
\makedefun{deffn}{\deffngeneral{}} |
|
|
Line 6560 end
|
Line 6825 end
|
\defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% |
\defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% |
} |
} |
|
|
%%% Typed functions: | % Typed functions: |
|
|
% @deftypefn category type name args |
% @deftypefn category type name args |
\makedefun{deftypefn}{\deftypefngeneral{}} |
\makedefun{deftypefn}{\deftypefngeneral{}} |
Line 6575 end
|
Line 6840 end
|
% |
% |
\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% |
\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% |
\dosubind{fn}{\code{#4}}{#1}% |
\dosubind{fn}{\code{#4}}{#1}% |
|
\doingtypefntrue |
\defname{#2}{#3}{#4}\defunargs{#5\unskip}% |
\defname{#2}{#3}{#4}\defunargs{#5\unskip}% |
} |
} |
|
|
%%% Typed variables: | % Typed variables: |
|
|
% @deftypevr category type var args |
% @deftypevr category type var args |
\makedefun{deftypevr}{\deftypecvgeneral{}} |
\makedefun{deftypevr}{\deftypecvgeneral{}} |
Line 6596 end
|
Line 6862 end
|
\defname{#2}{#3}{#4}\defunargs{#5\unskip}% |
\defname{#2}{#3}{#4}\defunargs{#5\unskip}% |
} |
} |
|
|
%%% Untyped variables: | % Untyped variables: |
|
|
% @defvr category var args |
% @defvr category var args |
\makedefun{defvr}#1 {\deftypevrheader{#1} {} } |
\makedefun{defvr}#1 {\deftypevrheader{#1} {} } |
Line 6607 end
|
Line 6873 end
|
% \defcvof {category of}class var args |
% \defcvof {category of}class var args |
\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } |
\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } |
|
|
%%% Type: | % Types: |
| |
% @deftp category name args |
% @deftp category name args |
\makedefun{deftp}#1 #2 #3\endheader{% |
\makedefun{deftp}#1 #2 #3\endheader{% |
\doind{tp}{\code{#2}}% |
\doind{tp}{\code{#2}}% |
Line 6635 end
|
Line 6902 end
|
% We are followed by (but not passed) the arguments, if any. |
% We are followed by (but not passed) the arguments, if any. |
% |
% |
\def\defname#1#2#3{% |
\def\defname#1#2#3{% |
|
\par |
% Get the values of \leftskip and \rightskip as they were outside the @def... |
% Get the values of \leftskip and \rightskip as they were outside the @def... |
\advance\leftskip by -\defbodyindent |
\advance\leftskip by -\defbodyindent |
% |
% |
% How we'll format the type name. Putting it in brackets helps | % Determine if we are typesetting the return type of a typed function |
| % on a line by itself. |
| \rettypeownlinefalse |
| \ifdoingtypefn % doing a typed function specifically? |
| % then check user option for putting return type on its own line: |
| \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else |
| \rettypeownlinetrue |
| \fi |
| \fi |
| % |
| % How we'll format the category name. Putting it in brackets helps |
% distinguish it from the body text that may end up on the next line |
% distinguish it from the body text that may end up on the next line |
% just below it. |
% just below it. |
\def\temp{#1}% |
\def\temp{#1}% |
\setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} |
\setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} |
% |
% |
% Figure out line sizes for the paragraph shape. | % Figure out line sizes for the paragraph shape. We'll always have at |
| % least two. |
| \tempnum = 2 |
| % |
% The first line needs space for \box0; but if \rightskip is nonzero, |
% The first line needs space for \box0; but if \rightskip is nonzero, |
% we need only space for the part of \box0 which exceeds it: |
% we need only space for the part of \box0 which exceeds it: |
\dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip |
\dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip |
|
% |
|
% If doing a return type on its own line, we'll have another line. |
|
\ifrettypeownline |
|
\advance\tempnum by 1 |
|
\def\maybeshapeline{0in \hsize}% |
|
\else |
|
\def\maybeshapeline{}% |
|
\fi |
|
% |
% The continuations: |
% The continuations: |
\dimen2=\hsize \advance\dimen2 by -\defargsindent |
\dimen2=\hsize \advance\dimen2 by -\defargsindent |
% (plain.tex says that \dimen1 should be used only as global.) |
|
\parshape 2 0in \dimen0 \defargsindent \dimen2 |
|
% |
% |
% Put the type name to the right margin. | % The final paragraph shape: |
| \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 |
| % |
| % Put the category name at the right margin. |
\noindent |
\noindent |
\hbox to 0pt{% |
\hbox to 0pt{% |
\hfil\box0 \kern-\hsize |
\hfil\box0 \kern-\hsize |
Line 6675 end
|
Line 6966 end
|
% . this still does not fix the ?` and !` ligatures, but so far no |
% . this still does not fix the ?` and !` ligatures, but so far no |
% one has made identifiers using them :). |
% one has made identifiers using them :). |
\df \tt |
\df \tt |
\def\temp{#2}% return value type | \def\temp{#2}% text of the return type |
\ifx\temp\empty\else \tclose{\temp} \fi | \ifx\temp\empty\else |
| \tclose{\temp}% typeset the return type |
| \ifrettypeownline |
| % put return type on its own line; prohibit line break following: |
| \hfil\vadjust{\nobreak}\break |
| \else |
| \space % type on same line, so just followed by a space |
| \fi |
| \fi % no return type |
#3% output function name |
#3% output function name |
}% |
}% |
{\rm\enskip}% hskip 0.5 em of \tenrm |
{\rm\enskip}% hskip 0.5 em of \tenrm |
Line 6794 end
|
Line 7093 end
|
|
|
% To do this right we need a feature of e-TeX, \scantokens, |
% To do this right we need a feature of e-TeX, \scantokens, |
% which we arrange to emulate with a temporary file in ordinary TeX. |
% which we arrange to emulate with a temporary file in ordinary TeX. |
\ifx\eTeXversion\undefined | \ifx\eTeXversion\thisisundefined |
\newwrite\macscribble |
\newwrite\macscribble |
\def\scantokens#1{% |
\def\scantokens#1{% |
\toks0={#1}% |
\toks0={#1}% |
Line 6805 end
|
Line 7104 end
|
} |
} |
\fi |
\fi |
|
|
\def\scanmacro#1{% | \def\scanmacro#1{\begingroup |
\begingroup | \newlinechar`\^^M |
\newlinechar`\^^M | \let\xeatspaces\eatspaces |
\let\xeatspaces\eatspaces | % |
% Undo catcode changes of \startcontents and \doprintindex | % Undo catcode changes of \startcontents and \doprintindex |
% When called from @insertcopying or (short)caption, we need active | % When called from @insertcopying or (short)caption, we need active |
% backslash to get it printed correctly. Previously, we had | % backslash to get it printed correctly. Previously, we had |
% \catcode`\\=\other instead. We'll see whether a problem appears | % \catcode`\\=\other instead. We'll see whether a problem appears |
% with macro expansion. --kasal, 19aug04 | % with macro expansion. --kasal, 19aug04 |
\catcode`\@=0 \catcode`\\=\active \escapechar=`\@ | \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ |
% ... and \example | % |
\spaceisspace | % ... and for \example: |
% | \spaceisspace |
% Append \endinput to make sure that TeX does not see the ending newline. | % |
% I've verified that it is necessary both for e-TeX and for ordinary TeX | % The \empty here causes a following catcode 5 newline to be eaten as |
% --kasal, 29nov03 | % part of reading whitespace after a control sequence. It does not |
\scantokens{#1\endinput}% | % eat a catcode 13 newline. There's no good way to handle the two |
\endgroup | % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX |
} | % would then have different behavior). See the Macro Details node in |
| % the manual for the workaround we recommend for macros and |
| % line-oriented commands. |
| % |
| \scantokens{#1\empty}% |
| \endgroup} |
|
|
\def\scanexp#1{% |
\def\scanexp#1{% |
\edef\temp{\noexpand\scanmacro{#1}}% |
\edef\temp{\noexpand\scanmacro{#1}}% |
Line 6877 end
|
Line 7181 end
|
|
|
% Macro bodies are absorbed as an argument in a context where |
% Macro bodies are absorbed as an argument in a context where |
% all characters are catcode 10, 11 or 12, except \ which is active |
% all characters are catcode 10, 11 or 12, except \ which is active |
% (as in normal texinfo). It is necessary to change the definition of \. | % (as in normal texinfo). It is necessary to change the definition of \ |
| % to recognize macro arguments; this is the job of \mbodybackslash. |
| % |
% Non-ASCII encodings make 8-bit characters active, so un-activate |
% Non-ASCII encodings make 8-bit characters active, so un-activate |
% them to avoid their expansion. Must do this non-globally, to |
% them to avoid their expansion. Must do this non-globally, to |
% confine the change to the current group. |
% confine the change to the current group. |
| % |
% It's necessary to have hard CRs when the macro is executed. This is |
% It's necessary to have hard CRs when the macro is executed. This is |
% done by making ^^M (\endlinechar) catcode 12 when reading the macro | % done by making ^^M (\endlinechar) catcode 12 when reading the macro |
% body, and then making it the \newlinechar in \scanmacro. |
% body, and then making it the \newlinechar in \scanmacro. |
| % |
\def\scanctxt{% | \def\scanctxt{% used as subroutine |
\catcode`\"=\other |
\catcode`\"=\other |
\catcode`\+=\other |
\catcode`\+=\other |
\catcode`\<=\other |
\catcode`\<=\other |
Line 6900 end
|
Line 7205 end
|
\ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi |
\ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi |
} |
} |
|
|
\def\scanargctxt{% | \def\scanargctxt{% used for copying and captions, not macros. |
\scanctxt |
\scanctxt |
\catcode`\\=\other |
\catcode`\\=\other |
\catcode`\^^M=\other |
\catcode`\^^M=\other |
} |
} |
|
|
\def\macrobodyctxt{% | \def\macrobodyctxt{% used for @macro definitions |
\scanctxt |
\scanctxt |
\catcode`\{=\other |
\catcode`\{=\other |
\catcode`\}=\other |
\catcode`\}=\other |
Line 6914 end
|
Line 7219 end
|
\usembodybackslash |
\usembodybackslash |
} |
} |
|
|
\def\macroargctxt{% | \def\macroargctxt{% used when scanning invocations |
\scanctxt |
\scanctxt |
\catcode`\\=\other | \catcode`\\=0 |
} |
} |
|
% why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" |
|
% for the single characters \ { }. Thus, we end up with the "commands" |
|
% that would be written @\ @{ @} in a Texinfo document. |
|
% |
|
% We already have @{ and @}. For @\, we define it here, and only for |
|
% this purpose, to produce a typewriter backslash (so, the @\ that we |
|
% define for @math can't be used with @macro calls): |
|
% |
|
\def\\{\normalbackslash}% |
|
% |
|
% We would like to do this for \, too, since that is what makeinfo does. |
|
% But it is not possible, because Texinfo already has a command @, for a |
|
% cedilla accent. Documents must use @comma{} instead. |
|
% |
|
% \anythingelse will almost certainly be an error of some kind. |
|
|
|
|
% \mbodybackslash is the definition of \ in @macro bodies. |
% \mbodybackslash is the definition of \ in @macro bodies. |
% It maps \foo\ => \csname macarg.foo\endcsname => #N |
% It maps \foo\ => \csname macarg.foo\endcsname => #N |
% where N is the macro parameter number. |
% where N is the macro parameter number. |
% We define \csname macarg.\endcsname to be \realbackslash, so |
% We define \csname macarg.\endcsname to be \realbackslash, so |
% \\ in macro replacement text gets you a backslash. |
% \\ in macro replacement text gets you a backslash. |
| % |
{\catcode`@=0 @catcode`@\=@active |
{\catcode`@=0 @catcode`@\=@active |
@gdef@usembodybackslash{@let\=@mbodybackslash} |
@gdef@usembodybackslash{@let\=@mbodybackslash} |
@gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} |
@gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} |
} |
} |
\expandafter\def\csname macarg.\endcsname{\realbackslash} |
\expandafter\def\csname macarg.\endcsname{\realbackslash} |
|
|
|
\def\margbackslash#1{\char`\#1 } |
|
|
\def\macro{\recursivefalse\parsearg\macroxxx} |
\def\macro{\recursivefalse\parsearg\macroxxx} |
\def\rmacro{\recursivetrue\parsearg\macroxxx} |
\def\rmacro{\recursivetrue\parsearg\macroxxx} |
|
|
\def\macroxxx#1{% |
\def\macroxxx#1{% |
\getargs{#1}% now \macname is the macname and \argl the arglist | \getargs{#1}% now \macname is the macname and \argl the arglist |
\ifx\argl\empty % no arguments |
\ifx\argl\empty % no arguments |
\paramno=0% | \paramno=0\relax |
\else |
\else |
\expandafter\parsemargdef \argl;% |
\expandafter\parsemargdef \argl;% |
|
\if\paramno>256\relax |
|
\ifx\eTeXversion\thisisundefined |
|
\errhelp = \EMsimple |
|
\errmessage{You need eTeX to compile a file with macros with more than 256 arguments} |
|
\fi |
|
\fi |
\fi |
\fi |
\if1\csname ismacro.\the\macname\endcsname |
\if1\csname ismacro.\the\macname\endcsname |
\message{Warning: redefining \the\macname}% |
\message{Warning: redefining \the\macname}% |
Line 6986 end
|
Line 7315 end
|
% an opening brace, and that opening brace is not consumed. |
% an opening brace, and that opening brace is not consumed. |
\def\getargs#1{\getargsxxx#1{}} |
\def\getargs#1{\getargsxxx#1{}} |
\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} |
\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} |
\def\getmacname #1 #2\relax{\macname={#1}} | \def\getmacname#1 #2\relax{\macname={#1}} |
\def\getmacargs#1{\def\argl{#1}} |
\def\getmacargs#1{\def\argl{#1}} |
|
|
|
% For macro processing make @ a letter so that we can make Texinfo private macro names. |
|
\edef\texiatcatcode{\the\catcode`\@} |
|
\catcode `@=11\relax |
|
|
% Parse the optional {params} list. Set up \paramno and \paramlist |
% Parse the optional {params} list. Set up \paramno and \paramlist |
% so \defmacro knows what to do. Define \macarg.blah for each blah | % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH |
% in the params list, to be ##N where N is the position in that list. | % in the params list to some hook where the argument si to be expanded. If |
| % there are less than 10 arguments that hook is to be replaced by ##N where N |
| % is the position in that list, that is to say the macro arguments are to be |
| % defined `a la TeX in the macro body. |
| % |
% That gets used by \mbodybackslash (above). |
% That gets used by \mbodybackslash (above). |
| % |
% We need to get `macro parameter char #' into several definitions. |
% We need to get `macro parameter char #' into several definitions. |
% The technique used is stolen from LaTeX: let \hash be something | % The technique used is stolen from LaTeX: let \hash be something |
% unexpandable, insert that wherever you need a #, and then redefine |
% unexpandable, insert that wherever you need a #, and then redefine |
% it to # just before using the token list produced. |
% it to # just before using the token list produced. |
% |
% |
% The same technique is used to protect \eatspaces till just before |
% The same technique is used to protect \eatspaces till just before |
% the macro is used. |
% the macro is used. |
| % |
\def\parsemargdef#1;{\paramno=0\def\paramlist{}% | % If there are 10 or more arguments, a different technique is used, where the |
\let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} | % hook remains in the body, and when macro is to be expanded the body is |
| % processed again to replace the arguments. |
| % |
| % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the |
| % argument N value and then \edef the body (nothing else will expand because of |
| % the catcode regime underwhich the body was input). |
| % |
| % If you compile with TeX (not eTeX), and you have macros with 10 or more |
| % arguments, you need that no macro has more than 256 arguments, otherwise an |
| % error is produced. |
| \def\parsemargdef#1;{% |
| \paramno=0\def\paramlist{}% |
| \let\hash\relax |
| \let\xeatspaces\relax |
| \parsemargdefxxx#1,;,% |
| % In case that there are 10 or more arguments we parse again the arguments |
| % list to set new definitions for the \macarg.BLAH macros corresponding to |
| % each BLAH argument. It was anyhow needed to parse already once this list |
| % in order to count the arguments, and as macros with at most 9 arguments |
| % are by far more frequent than macro with 10 or more arguments, defining |
| % twice the \macarg.BLAH macros does not cost too much processing power. |
| \ifnum\paramno<10\relax\else |
| \paramno0\relax |
| \parsemmanyargdef@@#1,;,% 10 or more arguments |
| \fi |
| } |
\def\parsemargdefxxx#1,{% |
\def\parsemargdefxxx#1,{% |
\if#1;\let\next=\relax |
\if#1;\let\next=\relax |
\else \let\next=\parsemargdefxxx |
\else \let\next=\parsemargdefxxx |
\advance\paramno by 1% | \advance\paramno by 1 |
\expandafter\edef\csname macarg.\eatspaces{#1}\endcsname |
\expandafter\edef\csname macarg.\eatspaces{#1}\endcsname |
{\xeatspaces{\hash\the\paramno}}% |
{\xeatspaces{\hash\the\paramno}}% |
\edef\paramlist{\paramlist\hash\the\paramno,}% |
\edef\paramlist{\paramlist\hash\the\paramno,}% |
\fi\next} |
\fi\next} |
|
|
|
\def\parsemmanyargdef@@#1,{% |
|
\if#1;\let\next=\relax |
|
\else |
|
\let\next=\parsemmanyargdef@@ |
|
\edef\tempb{\eatspaces{#1}}% |
|
\expandafter\def\expandafter\tempa |
|
\expandafter{\csname macarg.\tempb\endcsname}% |
|
% Note that we need some extra \noexpand\noexpand, this is because we |
|
% don't want \the to be expanded in the \parsermacbody as it uses an |
|
% \xdef . |
|
\expandafter\edef\tempa |
|
{\noexpand\noexpand\noexpand\the\toks\the\paramno}% |
|
\advance\paramno by 1\relax |
|
\fi\next} |
|
|
% These two commands read recursive and nonrecursive macro bodies. |
% These two commands read recursive and nonrecursive macro bodies. |
% (They're different since rec and nonrec macros end differently.) |
% (They're different since rec and nonrec macros end differently.) |
|
% |
|
|
|
\catcode `\@\texiatcatcode |
\long\def\parsemacbody#1@end macro% |
\long\def\parsemacbody#1@end macro% |
{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% |
{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% |
\long\def\parsermacbody#1@end rmacro% |
\long\def\parsermacbody#1@end rmacro% |
{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% |
{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% |
|
\catcode `\@=11\relax |
|
|
% This defines the macro itself. There are six cases: recursive and | \let\endargs@\relax |
% nonrecursive macros of zero, one, and many arguments. | \let\nil@\relax |
| \def\nilm@{\nil@}% |
| \long\def\nillm@{\nil@}% |
| |
| % This macro is expanded during the Texinfo macro expansion, not during its |
| % definition. It gets all the arguments values and assigns them to macros |
| % macarg.ARGNAME |
| % |
| % #1 is the macro name |
| % #2 is the list of argument names |
| % #3 is the list of argument values |
| \def\getargvals@#1#2#3{% |
| \def\macargdeflist@{}% |
| \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. |
| \def\paramlist{#2,\nil@}% |
| \def\macroname{#1}% |
| \begingroup |
| \macroargctxt |
| \def\argvaluelist{#3,\nil@}% |
| \def\@tempa{#3}% |
| \ifx\@tempa\empty |
| \setemptyargvalues@ |
| \else |
| \getargvals@@ |
| \fi |
| } |
| |
| % |
| \def\getargvals@@{% |
| \ifx\paramlist\nilm@ |
| % Some sanity check needed here that \argvaluelist is also empty. |
| \ifx\argvaluelist\nillm@ |
| \else |
| \errhelp = \EMsimple |
| \errmessage{Too many arguments in macro `\macroname'!}% |
| \fi |
| \let\next\macargexpandinbody@ |
| \else |
| \ifx\argvaluelist\nillm@ |
| % No more arguments values passed to macro. Set remaining named-arg |
| % macros to empty. |
| \let\next\setemptyargvalues@ |
| \else |
| % pop current arg name into \@tempb |
| \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% |
| \expandafter\@tempa\expandafter{\paramlist}% |
| % pop current argument value into \@tempc |
| \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% |
| \expandafter\@tempa\expandafter{\argvaluelist}% |
| % Here \@tempb is the current arg name and \@tempc is the current arg value. |
| % First place the new argument macro definition into \@tempd |
| \expandafter\macname\expandafter{\@tempc}% |
| \expandafter\let\csname macarg.\@tempb\endcsname\relax |
| \expandafter\def\expandafter\@tempe\expandafter{% |
| \csname macarg.\@tempb\endcsname}% |
| \edef\@tempd{\long\def\@tempe{\the\macname}}% |
| \push@\@tempd\macargdeflist@ |
| \let\next\getargvals@@ |
| \fi |
| \fi |
| \next |
| } |
| |
| \def\push@#1#2{% |
| \expandafter\expandafter\expandafter\def |
| \expandafter\expandafter\expandafter#2% |
| \expandafter\expandafter\expandafter{% |
| \expandafter#1#2}% |
| } |
| |
| % Replace arguments by their values in the macro body, and place the result |
| % in macro \@tempa |
| \def\macvalstoargs@{% |
| % To do this we use the property that token registers that are \the'ed |
| % within an \edef expand only once. So we are going to place all argument |
| % values into respective token registers. |
| % |
| % First we save the token context, and initialize argument numbering. |
| \begingroup |
| \paramno0\relax |
| % Then, for each argument number #N, we place the corresponding argument |
| % value into a new token list register \toks#N |
| \expandafter\putargsintokens@\saveparamlist@,;,% |
| % Then, we expand the body so that argument are replaced by their |
| % values. The trick for values not to be expanded themselves is that they |
| % are within tokens and that tokens expand only once in an \edef . |
| \edef\@tempc{\csname mac.\macroname .body\endcsname}% |
| % Now we restore the token stack pointer to free the token list registers |
| % which we have used, but we make sure that expanded body is saved after |
| % group. |
| \expandafter |
| \endgroup |
| \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% |
| } |
| |
| \def\macargexpandinbody@{% |
| %% Define the named-macro outside of this group and then close this group. |
| \expandafter |
| \endgroup |
| \macargdeflist@ |
| % First the replace in body the macro arguments by their values, the result |
| % is in \@tempa . |
| \macvalstoargs@ |
| % Then we point at the \norecurse or \gobble (for recursive) macro value |
| % with \@tempb . |
| \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname |
| % Depending on whether it is recursive or not, we need some tailing |
| % \egroup . |
| \ifx\@tempb\gobble |
| \let\@tempc\relax |
| \else |
| \let\@tempc\egroup |
| \fi |
| % And now we do the real job: |
| \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% |
| \@tempd |
| } |
| |
| \def\putargsintokens@#1,{% |
| \if#1;\let\next\relax |
| \else |
| \let\next\putargsintokens@ |
| % First we allocate the new token list register, and give it a temporary |
| % alias \@tempb . |
| \toksdef\@tempb\the\paramno |
| % Then we place the argument value into that token list register. |
| \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname |
| \expandafter\@tempb\expandafter{\@tempa}% |
| \advance\paramno by 1\relax |
| \fi |
| \next |
| } |
| |
| % Save the token stack pointer into macro #1 |
| \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} |
| % Restore the token stack pointer from number in macro #1 |
| \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} |
| % newtoks that can be used non \outer . |
| \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} |
| |
| % Tailing missing arguments are set to empty |
| \def\setemptyargvalues@{% |
| \ifx\paramlist\nilm@ |
| \let\next\macargexpandinbody@ |
| \else |
| \expandafter\setemptyargvaluesparser@\paramlist\endargs@ |
| \let\next\setemptyargvalues@ |
| \fi |
| \next |
| } |
| |
| \def\setemptyargvaluesparser@#1,#2\endargs@{% |
| \expandafter\def\expandafter\@tempa\expandafter{% |
| \expandafter\def\csname macarg.#1\endcsname{}}% |
| \push@\@tempa\macargdeflist@ |
| \def\paramlist{#2}% |
| } |
| |
| % #1 is the element target macro |
| % #2 is the list macro |
| % #3,#4\endargs@ is the list value |
| \def\pop@#1#2#3,#4\endargs@{% |
| \def#1{#3}% |
| \def#2{#4}% |
| } |
| \long\def\longpop@#1#2#3,#4\endargs@{% |
| \long\def#1{#3}% |
| \long\def#2{#4}% |
| } |
| |
| % This defines a Texinfo @macro. There are eight cases: recursive and |
| % nonrecursive macros of zero, one, up to nine, and many arguments. |
% Much magic with \expandafter here. |
% Much magic with \expandafter here. |
% \xdef is used so that macro definitions will survive the file |
% \xdef is used so that macro definitions will survive the file |
% they're defined in; @include reads the file inside a group. |
% they're defined in; @include reads the file inside a group. |
|
% |
\def\defmacro{% |
\def\defmacro{% |
\let\hash=##% convert placeholders to macro parameter chars |
\let\hash=##% convert placeholders to macro parameter chars |
\ifrecursive |
\ifrecursive |
Line 7040 end
|
Line 7592 end
|
\expandafter\noexpand\csname\the\macname xxx\endcsname}% |
\expandafter\noexpand\csname\the\macname xxx\endcsname}% |
\expandafter\xdef\csname\the\macname xxx\endcsname##1{% |
\expandafter\xdef\csname\the\macname xxx\endcsname##1{% |
\egroup\noexpand\scanmacro{\temp}}% |
\egroup\noexpand\scanmacro{\temp}}% |
\else % many | \else |
\expandafter\xdef\csname\the\macname\endcsname{% | \ifnum\paramno<10\relax % at most 9 |
\bgroup\noexpand\macroargctxt | \expandafter\xdef\csname\the\macname\endcsname{% |
\noexpand\csname\the\macname xx\endcsname}% | \bgroup\noexpand\macroargctxt |
\expandafter\xdef\csname\the\macname xx\endcsname##1{% | \noexpand\csname\the\macname xx\endcsname}% |
\expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% | \expandafter\xdef\csname\the\macname xx\endcsname##1{% |
\expandafter\expandafter | \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% |
\expandafter\xdef | \expandafter\expandafter |
\expandafter\expandafter | \expandafter\xdef |
\csname\the\macname xxx\endcsname | \expandafter\expandafter |
\paramlist{\egroup\noexpand\scanmacro{\temp}}% | \csname\the\macname xxx\endcsname |
| \paramlist{\egroup\noexpand\scanmacro{\temp}}% |
| \else % 10 or more |
| \expandafter\xdef\csname\the\macname\endcsname{% |
| \noexpand\getargvals@{\the\macname}{\argl}% |
| }% |
| \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp |
| \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble |
| \fi |
\fi |
\fi |
\else |
\else |
\ifcase\paramno |
\ifcase\paramno |
Line 7067 end
|
Line 7627 end
|
\egroup |
\egroup |
\noexpand\norecurse{\the\macname}% |
\noexpand\norecurse{\the\macname}% |
\noexpand\scanmacro{\temp}\egroup}% |
\noexpand\scanmacro{\temp}\egroup}% |
\else % many | \else % at most 9 |
\expandafter\xdef\csname\the\macname\endcsname{% | \ifnum\paramno<10\relax |
\bgroup\noexpand\macroargctxt | \expandafter\xdef\csname\the\macname\endcsname{% |
\expandafter\noexpand\csname\the\macname xx\endcsname}% | \bgroup\noexpand\macroargctxt |
\expandafter\xdef\csname\the\macname xx\endcsname##1{% | \expandafter\noexpand\csname\the\macname xx\endcsname}% |
\expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% | \expandafter\xdef\csname\the\macname xx\endcsname##1{% |
\expandafter\expandafter | \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% |
\expandafter\xdef | \expandafter\expandafter |
\expandafter\expandafter | \expandafter\xdef |
\csname\the\macname xxx\endcsname | \expandafter\expandafter |
\paramlist{% | \csname\the\macname xxx\endcsname |
\egroup | \paramlist{% |
\noexpand\norecurse{\the\macname}% | \egroup |
\noexpand\scanmacro{\temp}\egroup}% | \noexpand\norecurse{\the\macname}% |
| \noexpand\scanmacro{\temp}\egroup}% |
| \else % 10 or more: |
| \expandafter\xdef\csname\the\macname\endcsname{% |
| \noexpand\getargvals@{\the\macname}{\argl}% |
| }% |
| \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp |
| \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse |
| \fi |
\fi |
\fi |
\fi} |
\fi} |
|
|
|
\catcode `\@\texiatcatcode\relax |
|
|
\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} |
\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} |
|
|
% \braceorline decides whether the next nonwhitespace character is a |
% \braceorline decides whether the next nonwhitespace character is a |
% {. If so it reads up to the closing }, if not, it reads the whole |
% {. If so it reads up to the closing }, if not, it reads the whole |
% line. Whatever was read is then fed to the next control sequence |
% line. Whatever was read is then fed to the next control sequence |
% as an argument (by \parsebrace or \parsearg) | % as an argument (by \parsebrace or \parsearg). |
| % |
\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} |
\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} |
\def\braceorlinexxx{% |
\def\braceorlinexxx{% |
\ifx\nchar\bgroup\else |
\ifx\nchar\bgroup\else |
Line 7099 end
|
Line 7670 end
|
|
|
% @alias. |
% @alias. |
% We need some trickery to remove the optional spaces around the equal |
% We need some trickery to remove the optional spaces around the equal |
% sign. Just make them active and then expand them all to nothing. | % sign. Make them active and then expand them all to nothing. |
| % |
\def\alias{\parseargusing\obeyspaces\aliasxxx} |
\def\alias{\parseargusing\obeyspaces\aliasxxx} |
\def\aliasxxx #1{\aliasyyy#1\relax} |
\def\aliasxxx #1{\aliasyyy#1\relax} |
\def\aliasyyy #1=#2\relax{% |
\def\aliasyyy #1=#2\relax{% |
Line 7120 end
|
Line 7692 end
|
|
|
% @inforef is relatively simple. |
% @inforef is relatively simple. |
\def\inforef #1{\inforefzzz #1,,,,**} |
\def\inforef #1{\inforefzzz #1,,,,**} |
\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, | \def\inforefzzz #1,#2,#3,#4**{% |
| \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, |
node \samp{\ignorespaces#1{}}} |
node \samp{\ignorespaces#1{}}} |
|
|
% @node's only job in TeX is to define \lastnode, which is used in |
% @node's only job in TeX is to define \lastnode, which is used in |
Line 7181 end
|
Line 7754 end
|
\toks0 = \expandafter{\lastsection}% |
\toks0 = \expandafter{\lastsection}% |
\immediate \writexrdef{title}{\the\toks0 }% |
\immediate \writexrdef{title}{\the\toks0 }% |
\immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. |
\immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. |
\safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout | \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout |
}% |
}% |
\fi |
\fi |
} |
} |
|
|
|
% @xrefautosectiontitle on|off says whether @section(ing) names are used |
|
% automatically in xrefs, if the third arg is not explicitly specified. |
|
% This was provided as a "secret" @set xref-automatic-section-title |
|
% variable, now it's official. |
|
% |
|
\parseargdef\xrefautomaticsectiontitle{% |
|
\def\temp{#1}% |
|
\ifx\temp\onword |
|
\expandafter\let\csname SETxref-automatic-section-title\endcsname |
|
= \empty |
|
\else\ifx\temp\offword |
|
\expandafter\let\csname SETxref-automatic-section-title\endcsname |
|
= \relax |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @xrefautomaticsectiontitle value `\temp', |
|
must be on|off}% |
|
\fi\fi |
|
} |
|
|
|
|
% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is |
% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is |
% the node name, #2 the name of the Info cross-reference, #3 the printed |
% the node name, #2 the name of the Info cross-reference, #3 the printed |
% node name, #4 the name of the Info file, #5 the name of the printed |
% node name, #4 the name of the Info file, #5 the name of the printed |
Line 7202 end
|
Line 7796 end
|
\setbox0=\hbox{\printedrefname\unskip}% |
\setbox0=\hbox{\printedrefname\unskip}% |
\ifdim \wd0 = 0pt |
\ifdim \wd0 = 0pt |
% No printed node name was explicitly given. |
% No printed node name was explicitly given. |
\expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax | \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax |
% Use the node name inside the square brackets. |
% Use the node name inside the square brackets. |
\def\printedrefname{\ignorespaces #1}% |
\def\printedrefname{\ignorespaces #1}% |
\else |
\else |
Line 7357 end
|
Line 7951 end
|
\angleleft un\-de\-fined\angleright |
\angleleft un\-de\-fined\angleright |
\iflinks |
\iflinks |
\ifhavexrefs |
\ifhavexrefs |
\message{\linenumber Undefined cross reference `#1'.}% | {\toks0 = {#1}% avoid expansion of possibly-complex value |
| \message{\linenumber Undefined cross reference `\the\toks0'.}}% |
\else |
\else |
\ifwarnedxrefs\else |
\ifwarnedxrefs\else |
\global\warnedxrefstrue |
\global\warnedxrefstrue |
Line 7521 end
|
Line 8116 end
|
% space to prevent strange expansion errors.) |
% space to prevent strange expansion errors.) |
\def\supereject{\par\penalty -20000\footnoteno =0 } |
\def\supereject{\par\penalty -20000\footnoteno =0 } |
|
|
% @footnotestyle is meaningful for info output only. | % @footnotestyle is meaningful for Info output only. |
\let\footnotestyle=\comment |
\let\footnotestyle=\comment |
|
|
{\catcode `\@=11 |
{\catcode `\@=11 |
Line 7584 end
|
Line 8179 end
|
% expands into a box, it must come within the paragraph, lest it |
% expands into a box, it must come within the paragraph, lest it |
% provide a place where TeX can split the footnote. |
% provide a place where TeX can split the footnote. |
\footstrut |
\footstrut |
|
% |
|
% Invoke rest of plain TeX footnote routine. |
\futurelet\next\fo@t |
\futurelet\next\fo@t |
} |
} |
}%end \catcode `\@=11 |
}%end \catcode `\@=11 |
Line 7671 end
|
Line 8268 end
|
it from ftp://tug.org/tex/epsf.tex.} |
it from ftp://tug.org/tex/epsf.tex.} |
% |
% |
\def\image#1{% |
\def\image#1{% |
\ifx\epsfbox\undefined | \ifx\epsfbox\thisiundefined |
\ifwarnednoepsf \else |
\ifwarnednoepsf \else |
\errhelp = \noepsfhelp |
\errhelp = \noepsfhelp |
\errmessage{epsf.tex not found, images will be ignored}% |
\errmessage{epsf.tex not found, images will be ignored}% |
Line 7687 end
|
Line 8284 end
|
% #2 is (optional) width, #3 is (optional) height. |
% #2 is (optional) width, #3 is (optional) height. |
% #4 is (ignored optional) html alt text. |
% #4 is (ignored optional) html alt text. |
% #5 is (ignored optional) extension. |
% #5 is (ignored optional) extension. |
% #6 is just the usual extra ignored arg for parsing this stuff. | % #6 is just the usual extra ignored arg for parsing stuff. |
\newif\ifimagevmode |
\newif\ifimagevmode |
\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup |
\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup |
\catcode`\^^M = 5 % in case we're inside an example |
\catcode`\^^M = 5 % in case we're inside an example |
Line 8136 directory should work if nowhere else does.}
|
Line 8733 directory should work if nowhere else does.}
|
% |
% |
% Latin1 (ISO-8859-1) character definitions. |
% Latin1 (ISO-8859-1) character definitions. |
\def\latonechardefs{% |
\def\latonechardefs{% |
\gdef^^a0{~} | \gdef^^a0{\tie} |
\gdef^^a1{\exclamdown} |
\gdef^^a1{\exclamdown} |
\gdef^^a2{\missingcharmsg{CENT SIGN}} |
\gdef^^a2{\missingcharmsg{CENT SIGN}} |
\gdef^^a3{{\pounds}} |
\gdef^^a3{{\pounds}} |
Line 8166 directory should work if nowhere else does.}
|
Line 8763 directory should work if nowhere else does.}
|
\gdef^^b9{$^1$} |
\gdef^^b9{$^1$} |
\gdef^^ba{\ordm} |
\gdef^^ba{\ordm} |
% |
% |
\gdef^^bb{\guilletright} | \gdef^^bb{\guillemetright} |
\gdef^^bc{$1\over4$} |
\gdef^^bc{$1\over4$} |
\gdef^^bd{$1\over2$} |
\gdef^^bd{$1\over2$} |
\gdef^^be{$3\over4$} |
\gdef^^be{$3\over4$} |
Line 8258 directory should work if nowhere else does.}
|
Line 8855 directory should work if nowhere else does.}
|
|
|
% Latin2 (ISO-8859-2) character definitions. |
% Latin2 (ISO-8859-2) character definitions. |
\def\lattwochardefs{% |
\def\lattwochardefs{% |
\gdef^^a0{~} | \gdef^^a0{\tie} |
\gdef^^a1{\ogonek{A}} |
\gdef^^a1{\ogonek{A}} |
\gdef^^a2{\u{}} |
\gdef^^a2{\u{}} |
\gdef^^a3{\L} |
\gdef^^a3{\L} |
Line 8339 directory should work if nowhere else does.}
|
Line 8936 directory should work if nowhere else does.}
|
\gdef^^ea{\ogonek{e}} |
\gdef^^ea{\ogonek{e}} |
\gdef^^eb{\"e} |
\gdef^^eb{\"e} |
\gdef^^ec{\v e} |
\gdef^^ec{\v e} |
\gdef^^ed{\'\i} | \gdef^^ed{\'{\dotless{i}}} |
\gdef^^ee{\^\i} | \gdef^^ee{\^{\dotless{i}}} |
\gdef^^ef{\v d} |
\gdef^^ef{\v d} |
% |
% |
\gdef^^f0{\dh} |
\gdef^^f0{\dh} |
Line 8431 directory should work if nowhere else does.}
|
Line 9028 directory should work if nowhere else does.}
|
|
|
\gdef\DeclareUnicodeCharacter#1#2{% |
\gdef\DeclareUnicodeCharacter#1#2{% |
\countUTFz = "#1\relax |
\countUTFz = "#1\relax |
\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% | %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% |
\begingroup |
\begingroup |
\parseXMLCharref |
\parseXMLCharref |
\def\UTFviiiTwoOctets##1##2{% |
\def\UTFviiiTwoOctets##1##2{% |
Line 8899 directory should work if nowhere else does.}
|
Line 9496 directory should work if nowhere else does.}
|
% Prevent underfull vbox error messages. |
% Prevent underfull vbox error messages. |
\vbadness = 10000 |
\vbadness = 10000 |
|
|
% Don't be so finicky about underfull hboxes, either. | % Don't be very finicky about underfull hboxes, either. |
\hbadness = 2000 | \hbadness = 6666 |
|
|
% Following George Bush, get rid of widows and orphans. |
% Following George Bush, get rid of widows and orphans. |
\widowpenalty=10000 |
\widowpenalty=10000 |
Line 9107 directory should work if nowhere else does.}
|
Line 9704 directory should work if nowhere else does.}
|
|
|
\message{and turning on texinfo input format.} |
\message{and turning on texinfo input format.} |
|
|
|
\def^^L{\par} % remove \outer, so ^L can appear in an @comment |
|
|
% DEL is a comment character, in case @c does not suffice. |
% DEL is a comment character, in case @c does not suffice. |
\catcode`\^^? = 14 |
\catcode`\^^? = 14 |
|
|
% Define macros to output various characters with catcode for normal text. |
% Define macros to output various characters with catcode for normal text. |
\catcode`\"=\other | \catcode`\"=\other \def\normaldoublequote{"} |
\catcode`\~=\other | \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix |
\catcode`\^=\other | \catcode`\+=\other \def\normalplus{+} |
\catcode`\_=\other | \catcode`\<=\other \def\normalless{<} |
\catcode`\|=\other | \catcode`\>=\other \def\normalgreater{>} |
\catcode`\<=\other | \catcode`\^=\other \def\normalcaret{^} |
\catcode`\>=\other | \catcode`\_=\other \def\normalunderscore{_} |
\catcode`\+=\other | \catcode`\|=\other \def\normalverticalbar{|} |
\catcode`\$=\other | \catcode`\~=\other \def\normaltilde{~} |
\def\normaldoublequote{"} | |
\def\normaltilde{~} | |
\def\normalcaret{^} | |
\def\normalunderscore{_} | |
\def\normalverticalbar{|} | |
\def\normalless{<} | |
\def\normalgreater{>} | |
\def\normalplus{+} | |
\def\normaldollar{$}%$ font-lock fix | |
|
|
% This macro is used to make a character print one way in \tt |
% This macro is used to make a character print one way in \tt |
% (where it can probably be output as-is), and another way in other fonts, |
% (where it can probably be output as-is), and another way in other fonts, |
Line 9221 directory should work if nowhere else does.}
|
Line 9811 directory should work if nowhere else does.}
|
% the literal character `\'. |
% the literal character `\'. |
% |
% |
@def@normalturnoffactive{% |
@def@normalturnoffactive{% |
@let\=@normalbackslash |
|
@let"=@normaldoublequote |
@let"=@normaldoublequote |
@let~=@normaltilde | @let$=@normaldollar %$ font-lock fix |
| @let+=@normalplus |
| @let<=@normalless |
| @let>=@normalgreater |
| @let\=@normalbackslash |
@let^=@normalcaret |
@let^=@normalcaret |
@let_=@normalunderscore |
@let_=@normalunderscore |
@let|=@normalverticalbar |
@let|=@normalverticalbar |
@let<=@normalless | @let~=@normaltilde |
@let>=@normalgreater | |
@let+=@normalplus | |
@let$=@normaldollar %$ font-lock fix | |
@markupsetuplqdefault |
@markupsetuplqdefault |
@markupsetuprqdefault |
@markupsetuprqdefault |
@unsepspaces |
@unsepspaces |
Line 9262 directory should work if nowhere else does.}
|
Line 9852 directory should work if nowhere else does.}
|
% Say @foo, not \foo, in error messages. |
% Say @foo, not \foo, in error messages. |
@escapechar = `@@ |
@escapechar = `@@ |
|
|
|
% These (along with & and #) are made active for url-breaking, so need |
|
% active definitions as the normal characters. |
|
@def@normaldot{.} |
|
@def@normalquest{?} |
|
@def@normalslash{/} |
|
|
% These look ok in all fonts, so just make them not special. |
% These look ok in all fonts, so just make them not special. |
@catcode`@& = @other | @catcode`@& = @other @def@normalamp{&} |
@catcode`@# = @other | @catcode`@# = @other @def@normalhash{#} |
@catcode`@% = @other | @catcode`@% = @other @def@normalpercent{%} |
|
|
@c Finally, make ` and ' active, so that txicodequoteundirected and |
@c Finally, make ` and ' active, so that txicodequoteundirected and |
@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we |
@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we |