version 1.1, 2025/01/19 02:04:04
|
version 1.6, 2025/05/16 04:02:14
|
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{2021-04-25.21} |
\def\texinfoversion{2024-02-10.22} |
% |
% |
% Copyright 1985, 1986, 1988, 1990-2021 Free Software Foundation, Inc. |
% Copyright 1985, 1986, 1988, 1990-2024 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 58
|
Line 58
|
|
|
\message{Loading texinfo [version \texinfoversion]:} |
\message{Loading texinfo [version \texinfoversion]:} |
|
|
% If in a .fmt file, print the version number |
|
% and turn on active characters that we couldn't do earlier because |
|
% they might have appeared in the input file name. |
|
\everyjob{\message{[Texinfo version \texinfoversion]}% |
|
\catcode`+=\active \catcode`\_=\active} |
|
|
|
% LaTeX's \typeout. This ensures that the messages it is used for |
% LaTeX's \typeout. This ensures that the messages it is used for |
% are identical in format to the corresponding ones from latex/pdflatex. |
% are identical in format to the corresponding ones from latex/pdflatex. |
\def\typeout{\immediate\write17}% |
\def\typeout{\immediate\write17}% |
Line 241
|
Line 235
|
% |
% |
\def\finalout{\overfullrule=0pt } |
\def\finalout{\overfullrule=0pt } |
|
|
\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines |
|
\newdimen\topandbottommargin \topandbottommargin=.75in |
|
|
|
% Output a mark which sets \thischapter, \thissection and \thiscolor. |
% Output a mark which sets \thischapter, \thissection and \thiscolor. |
% We dump everything together because we only have one kind of mark. |
% We dump everything together because we only have one kind of mark. |
% This works because we only use \botmark / \topmark, not \firstmark. |
% This works because we only use \botmark / \topmark, not \firstmark. |
Line 284
|
Line 275
|
% \topmark doesn't work for the very first chapter (after the title |
% \topmark doesn't work for the very first chapter (after the title |
% page or the contents), so we use \firstmark there -- this gets us |
% page or the contents), so we use \firstmark there -- this gets us |
% the mark with the chapter defs, unless the user sneaks in, e.g., |
% the mark with the chapter defs, unless the user sneaks in, e.g., |
% @setcolor (or @url, or @link, etc.) between @contents and the very |
% @setcolor (or @url etc.) between @contents and the very first @chapter. |
% first @chapter. |
|
\def\gettopheadingmarks{% |
\def\gettopheadingmarks{% |
\ifcase0\the\savedtopmark\fi |
\ifcase0\the\savedtopmark\fi |
\ifx\thischapter\empty \ifcase0\firstmark\fi \fi |
\ifx\thischapter\empty \ifcase0\firstmark\fi \fi |
Line 317
|
Line 307
|
\newbox\footlinebox |
\newbox\footlinebox |
|
|
% When outputting the double column layout for indices, an output routine |
% When outputting the double column layout for indices, an output routine |
% is run several times, which hides the original value of \topmark. This |
% is run several times, hiding the original value of \topmark. Hence, save |
% can lead to a page heading being output and duplicating the chapter heading |
% \topmark at the beginning. |
% of the index. Hence, save the contents of \topmark at the beginning of |
|
% the output routine. The saved contents are valid until we actually |
|
% \shipout a page. |
|
% |
|
% (We used to run a short output routine to actually set \topmark and |
|
% \firstmark to the right values, but if this was called with an empty page |
|
% containing whatsits for writing index entries, the whatsits would be thrown |
|
% away and the index auxiliary file would remain empty.) |
|
% |
% |
\newtoks\savedtopmark |
\newtoks\savedtopmark |
\newif\iftopmarksaved |
\newif\iftopmarksaved |
Line 351
|
Line 333
|
% |
% |
\checkchapterpage |
\checkchapterpage |
% |
% |
% Retrieve the information for the headings from the marks in the page, |
% Make the heading and footing. \makeheadline and \makefootline |
% and call Plain TeX's \makeheadline and \makefootline, which use the |
% use the contents of \headline and \footline. |
% values in \headline and \footline. |
|
% |
|
% Common context changes for both heading and footing. |
|
% Do this outside of the \shipout so @code etc. will be expanded in |
|
% the headline as they should be, not taken literally (outputting ''code). |
|
\def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} |
\def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} |
% |
|
\ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi |
\ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi |
\global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% |
\global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% |
\ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi |
\ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi |
Line 450
|
Line 426
|
} |
} |
|
|
% First remove any @comment, then any @c comment. Pass the result on to |
% First remove any @comment, then any @c comment. Pass the result on to |
% \argcheckspaces. |
% \argremovespace. |
\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} |
\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} |
\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} |
\def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm} |
|
% \argremovec might leave us with trailing space, though; e.g., |
% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space. |
|
% |
|
% \argremovec might leave us with trailing space, e.g., |
|
% @end itemize @c foo |
% @end itemize @c foo |
% This space token undergoes the same procedure and is eventually removed |
% Note that the argument cannot contain the TeX $, as its catcode is |
% by \finishparsearg. |
% changed to \other when Texinfo source is read. |
% |
\def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\ArgTerm} |
\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} |
|
\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} |
|
\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% |
|
\def\temp{#3}% |
|
\ifx\temp\empty |
|
% Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: |
|
\let\temp\finishparsearg |
|
\else |
|
\let\temp\argcheckspaces |
|
\fi |
|
% Put the space token in: |
|
\temp#1 #3\ArgTerm |
|
} |
|
|
|
% If a _delimited_ argument is enclosed in braces, they get stripped; so |
% If a _delimited_ argument is enclosed in braces, they get stripped; so |
% to get _exactly_ the rest of the line, we had to prevent such situation. |
% to get _exactly_ the rest of the line, we had to prevent such situation. |
% We prepended an \empty token at the very beginning and we expand it now, |
% We prepended an \empty token at the very beginning and we expand it |
% just before passing the control to \argtorun. |
% just before passing the control to \next. |
% (Similarly, we have to think about #3 of \argcheckspacesY above: it is |
% (But first, we have to remove the remaining $ or two.) |
% either the null string, or it ends with \^^M---thus there is no danger |
\def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}} |
% that a pair of braces would be stripped. |
|
% |
|
% But first, we have to remove the trailing space token. |
|
% |
|
\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} |
|
|
|
|
|
% \parseargdef - define a command taking an argument on the line |
% \parseargdef - define a command taking an argument on the line |
Line 547
|
Line 502
|
|
|
% ... but they get defined via ``\envdef\foo{...}'': |
% ... but they get defined via ``\envdef\foo{...}'': |
\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} |
\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} |
\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} |
\long\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} |
|
|
% Check whether we're in the right environment: |
% Check whether we're in the right environment: |
\def\checkenv#1{% |
\def\checkenv#1{% |
Line 608
|
Line 563
|
% @/ allows a line break. |
% @/ allows a line break. |
\let\/=\allowbreak |
\let\/=\allowbreak |
|
|
|
% @- allows explicit insertion of hyphenation points |
|
\def\-{\discretionary{\normaldash}{}{}}% |
|
|
% @. is an end-of-sentence period. |
% @. is an end-of-sentence period. |
\def\.{.\spacefactor=\endofsentencespacefactor\space} |
\def\.{.\spacefactor=\endofsentencespacefactor\space} |
|
|
Line 617
|
Line 575
|
% @? is an end-of-sentence query. |
% @? is an end-of-sentence query. |
\def\?{?\spacefactor=\endofsentencespacefactor\space} |
\def\?{?\spacefactor=\endofsentencespacefactor\space} |
|
|
% @frenchspacing on|off says whether to put extra space after punctuation. |
|
% |
|
\def\onword{on} |
|
\def\offword{off} |
|
% |
|
\parseargdef\frenchspacing{% |
|
\def\temp{#1}% |
|
\ifx\temp\onword \plainfrenchspacing |
|
\else\ifx\temp\offword \plainnonfrenchspacing |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @frenchspacing option `\temp', must be on|off}% |
|
\fi\fi |
|
} |
|
|
|
% @w prevents a word break. Without the \leavevmode, @w at the |
% @w prevents a word break. Without the \leavevmode, @w at the |
% beginning of a paragraph, when TeX is still in vertical mode, would |
% beginning of a paragraph, when TeX is still in vertical mode, would |
% produce a whole line of output instead of starting the paragraph. |
% produce a whole line of output instead of starting the paragraph. |
Line 725 where each line of input produces a line
|
Line 668 where each line of input produces a line
|
\dimen2 = \ht\strutbox |
\dimen2 = \ht\strutbox |
\advance\dimen2 by \dp\strutbox |
\advance\dimen2 by \dp\strutbox |
\ifdim\dimen0 > \dimen2 |
\ifdim\dimen0 > \dimen2 |
% |
% This is similar to the 'needspace' module in LaTeX. |
% Do a \strut just to make the height of this box be normal, so the |
% The first penalty allows a break if the end of the page is |
% normal leading is inserted relative to the preceding line. |
% not too far away. Following penalties and skips are discarded. |
% And a page break here is fine. |
% Otherwise, require at least \dimen0 of vertical space. |
\vtop to #1\mil{\strut\vfil}% |
% |
% |
% (We used to use a \vtop to reserve space, but this had spacing issues |
% TeX does not even consider page breaks if a penalty added to the |
% when followed by a section heading, as it was not a "discardable item". |
% main vertical list is 10000 or more. But in order to see if the |
% This also has the benefit of providing glue before the page break if |
% empty box we just added fits on the page, we must make it consider |
% there isn't enough space.) |
% page breaks. On the other hand, we don't want to actually break the |
\vskip0pt plus \dimen0 |
% page after the empty box. So we use a penalty of 9999. |
\penalty-100 |
% |
\vskip0pt plus -\dimen0 |
% There is an extremely small chance that TeX will actually break the |
\vskip \dimen0 |
% page at this \penalty, if there are no other feasible breakpoints in |
|
% sight. (If the user is using lots of big @group commands, which |
|
% almost-but-not-quite fill up a page, TeX will have a hard time doing |
|
% good page breaking, for example.) However, I could not construct an |
|
% example where a page broke at this \penalty; if it happens in a real |
|
% document, then we can reconsider our strategy. |
|
\penalty9999 |
\penalty9999 |
% |
\vskip -\dimen0 |
% Back up by the size of the box, whether we did a page break or not. |
\penalty0\relax % this hides the above glue from \safewhatsit and \dobreak |
\kern -#1\mil |
|
% |
|
% Do not allow a page break right after this kern. |
|
\nobreak |
|
\fi |
\fi |
} |
} |
|
|
Line 1147 where each line of input produces a line
|
Line 1080 where each line of input produces a line
|
|
|
% Output page labels information. |
% Output page labels information. |
% See PDF reference v.1.7 p.594, section 8.3.1. |
% See PDF reference v.1.7 p.594, section 8.3.1. |
|
% Page label ranges must be increasing. |
\ifpdf |
\ifpdf |
\def\pagelabels{% |
\def\pagelabels{% |
\def\title{0 << /P (T-) /S /D >>}% |
\def\title{0 << /P (T-) /S /D >>}% |
\edef\roman{\the\romancount << /S /r >>}% |
|
\edef\arabic{\the\arabiccount << /S /D >>}% |
|
% |
|
% Page label ranges must be increasing. Remove any duplicates. |
|
% (There is a slight chance of this being wrong if e.g. there is |
|
% a @contents but no @titlepage, etc.) |
|
% |
|
\ifnum\romancount=0 \def\roman{}\fi |
|
\ifnum\arabiccount=0 \def\title{}% |
|
\else |
|
\ifnum\romancount=\arabiccount \def\roman{}\fi |
|
\fi |
|
% |
% |
\ifnum\romancount<\arabiccount |
% support @contents at very end of document |
\pdfcatalog{/PageLabels << /Nums [\title \roman \arabic ] >> }\relax |
\ifnum\contentsendcount=\pagecount |
\else |
\ifnum\arabiccount<\romancount |
\pdfcatalog{/PageLabels << /Nums [\title \arabic \roman ] >> }\relax |
\pdfcatalog{/PageLabels << /Nums |
\fi |
[\title |
|
\the\arabiccount << /S /D >> |
|
\the\romancount << /S /r >> |
|
] >> }\relax |
|
\fi |
|
% no contents in document |
|
\else\ifnum\contentsendcount=0 |
|
\pdfcatalog{/PageLabels << /Nums |
|
[\title |
|
\the\arabiccount << /S /D >> |
|
] >> }\relax |
|
\else |
|
\pdfcatalog{/PageLabels << /Nums |
|
[\title |
|
\the\romancount << /S /r >> |
|
\the\contentsendcount << /S /D >> |
|
] >> }\relax |
|
\fi\fi |
} |
} |
\else |
\else |
\let\pagelabels\relax |
\let\pagelabels\relax |
Line 1176 where each line of input produces a line
|
Line 1115 where each line of input produces a line
|
\newcount\pagecount \pagecount=0 |
\newcount\pagecount \pagecount=0 |
\newcount\romancount \romancount=0 |
\newcount\romancount \romancount=0 |
\newcount\arabiccount \arabiccount=0 |
\newcount\arabiccount \arabiccount=0 |
|
\newcount\contentsendcount \contentsendcount=0 |
|
|
\ifpdf |
\ifpdf |
\let\ptxadvancepageno\advancepageno |
\let\ptxadvancepageno\advancepageno |
\def\advancepageno{% |
\def\advancepageno{% |
Line 1239 output) for that.)}
|
Line 1180 output) for that.)}
|
% |
% |
% Set color, and create a mark which defines \thiscolor accordingly, |
% Set color, and create a mark which defines \thiscolor accordingly, |
% so that \makeheadline knows which color to restore. |
% so that \makeheadline knows which color to restore. |
|
\def\curcolor{0 0 0}% |
\def\setcolor#1{% |
\def\setcolor#1{% |
\xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% |
\ifx#1\curcolor\else |
\domark |
\xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% |
\pdfsetcolor{#1}% |
\domark |
|
\pdfsetcolor{#1}% |
|
\xdef\curcolor{#1}% |
|
\fi |
} |
} |
% |
% |
\def\maincolor{\rgbBlack} |
\let\maincolor\rgbBlack |
\pdfsetcolor{\maincolor} |
\pdfsetcolor{\maincolor} |
\edef\thiscolor{\maincolor} |
\edef\thiscolor{\maincolor} |
\def\currentcolordefs{} |
\def\currentcolordefs{} |
Line 1401 output) for that.)}
|
Line 1346 output) for that.)}
|
% |
% |
% by default, use black for everything. |
% by default, use black for everything. |
\def\urlcolor{\rgbBlack} |
\def\urlcolor{\rgbBlack} |
\def\linkcolor{\rgbBlack} |
\let\linkcolor\rgbBlack |
\def\endlink{\setcolor{\maincolor}\pdfendlink} |
\def\endlink{\setcolor{\maincolor}\pdfendlink} |
% |
% |
% Adding outlines to PDF; macros for calculating structure of outlines |
% Adding outlines to PDF; macros for calculating structure of outlines |
Line 1579 output) for that.)}
|
Line 1524 output) for that.)}
|
\next} |
\next} |
\def\makelink{\addtokens{\toksB}% |
\def\makelink{\addtokens{\toksB}% |
{\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} |
{\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} |
\def\pdflink#1{% |
\def\pdflink#1{\pdflinkpage{#1}{#1}}% |
|
\def\pdflinkpage#1#2{% |
\startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} |
\startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} |
\setcolor{\linkcolor}#1\endlink} |
\setcolor{\linkcolor}#2\endlink} |
\def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} |
\def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} |
\else |
\else |
% non-pdf mode |
% non-pdf mode |
Line 1828 output) for that.)}
|
Line 1774 output) for that.)}
|
\next} |
\next} |
\def\makelink{\addtokens{\toksB}% |
\def\makelink{\addtokens{\toksB}% |
{\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} |
{\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} |
\def\pdflink#1{% |
\def\pdflink#1{\pdflinkpage{#1}{#1}}% |
|
\def\pdflinkpage#1#2{% |
\special{pdf:bann << /Border [0 0 0] |
\special{pdf:bann << /Border [0 0 0] |
/Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% |
/Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% |
\setcolor{\linkcolor}#1\endlink} |
\setcolor{\linkcolor}#2\endlink} |
\def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} |
\def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} |
% |
% |
% |
% |
Line 2176 end
|
Line 2123 end
|
\pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% |
\pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% |
}% |
}% |
\fi\fi |
\fi\fi |
|
% |
|
% This is what gets called when #5 of \setfont is empty. |
|
\let\cmap\gobble |
|
% |
|
% (end of cmaps) |
|
|
|
|
% Set the font macro #1 to the font named \fontprefix#2. |
% Set the font macro #1 to the font named \fontprefix#2. |
Line 2191 end
|
Line 2143 end
|
\def\setfont#1#2#3#4#5{% |
\def\setfont#1#2#3#4#5{% |
\font#1=\fontprefix#2#3 scaled #4 |
\font#1=\fontprefix#2#3 scaled #4 |
\csname cmap#5\endcsname#1% |
\csname cmap#5\endcsname#1% |
|
\ifx#2\ttshape\hyphenchar#1=-1 \fi |
|
\ifx#2\ttbshape\hyphenchar#1=-1 \fi |
|
\ifx#2\ttslshape\hyphenchar#1=-1 \fi |
} |
} |
% This is what gets called when #5 of \setfont is empty. |
|
\let\cmap\gobble |
|
% |
|
% (end of cmaps) |
|
|
|
% 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 |
Line 2558 end
|
Line 2509 end
|
\def\it{\fam=\itfam \setfontstyle{it}} |
\def\it{\fam=\itfam \setfontstyle{it}} |
\def\sl{\fam=\slfam \setfontstyle{sl}} |
\def\sl{\fam=\slfam \setfontstyle{sl}} |
\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} |
\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} |
\def\tt{\fam=\ttfam \setfontstyle{tt}}\def\ttstylename{tt} |
\def\tt{\fam=\ttfam \setfontstyle{tt}} |
|
|
% Texinfo sort of supports the sans serif font style, which plain TeX does not. |
% Texinfo sort of supports the sans serif font style, which plain TeX does not. |
% So we set up a \sf. |
% So we set up a \sf. |
Line 2586 end
|
Line 2537 end
|
\scriptfont\sffam=\sevensf |
\scriptfont\sffam=\sevensf |
} |
} |
|
|
% |
|
|
|
% The font-changing commands (all called \...fonts) redefine the meanings |
|
% of \STYLEfont, instead of just \STYLE. We do this because \STYLE needs |
% \defineassignfonts{SIZE} - |
% to also set the current \fam for math mode. Our \STYLE (e.g., \rm) |
% Define sequence \assignfontsSIZE, which switches between font sizes |
% commands hardwire \STYLEfont to set the current font. |
% by redefining the meanings of \STYLEfont. (Just \STYLE additionally sets |
% |
% the current \fam for math mode.) |
% The fonts used for \ifont are for "math italics" (\itfont is for italics |
% |
% in regular text). \syfont is also used in math mode only. |
\def\defineassignfonts#1{% |
% |
\expandafter\edef\csname assignfonts#1\endcsname{% |
% Each font-changing command also sets the names \lsize (one size lower) |
\let\noexpand\rmfont\csname #1rm\endcsname |
% and \lllsize (three sizes lower). These relative commands are used |
\let\noexpand\itfont\csname #1it\endcsname |
% in, e.g., the LaTeX logo and acronyms. |
\let\noexpand\slfont\csname #1sl\endcsname |
% |
\let\noexpand\bffont\csname #1bf\endcsname |
% This all needs generalizing, badly. |
\let\noexpand\ttfont\csname #1tt\endcsname |
% |
\let\noexpand\smallcaps\csname #1sc\endcsname |
|
\let\noexpand\sffont \csname #1sf\endcsname |
|
\let\noexpand\ifont \csname #1i\endcsname |
|
\let\noexpand\syfont \csname #1sy\endcsname |
|
\let\noexpand\ttslfont\csname #1ttsl\endcsname |
|
} |
|
} |
|
|
\def\assignfonts#1{% |
\def\assignfonts#1{% |
\expandafter\let\expandafter\rmfont\csname #1rm\endcsname |
\csname assignfonts#1\endcsname |
\expandafter\let\expandafter\itfont\csname #1it\endcsname |
|
\expandafter\let\expandafter\slfont\csname #1sl\endcsname |
|
\expandafter\let\expandafter\bffont\csname #1bf\endcsname |
|
\expandafter\let\expandafter\ttfont\csname #1tt\endcsname |
|
\expandafter\let\expandafter\smallcaps\csname #1sc\endcsname |
|
\expandafter\let\expandafter\sffont \csname #1sf\endcsname |
|
\expandafter\let\expandafter\ifont \csname #1i\endcsname |
|
\expandafter\let\expandafter\syfont \csname #1sy\endcsname |
|
\expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname |
|
} |
} |
|
|
\newif\ifrmisbold |
\newif\ifrmisbold |
Line 2637 end
|
Line 2584 end
|
\csname\curfontstyle\endcsname |
\csname\curfontstyle\endcsname |
}% |
}% |
|
|
|
% Define the font-changing commands (all called \...fonts). |
|
% Each font-changing command also sets the names \lsize (one size lower) |
|
% and \lllsize (three sizes lower). These relative commands are used |
|
% in, e.g., the LaTeX logo and acronyms. |
|
% |
|
% Note: The fonts used for \ifont are for "math italics" (\itfont is for |
|
% italics in regular text). \syfont is also used in math mode only. |
|
% |
\def\definefontsetatsize#1#2#3#4#5{% |
\def\definefontsetatsize#1#2#3#4#5{% |
|
\defineassignfonts{#1}% |
\expandafter\def\csname #1fonts\endcsname{% |
\expandafter\def\csname #1fonts\endcsname{% |
\def\curfontsize{#1}% |
\def\curfontsize{#1}% |
\def\lsize{#2}\def\lllsize{#3}% |
\def\lsize{#2}\def\lllsize{#3}% |
\csname rmisbold#5\endcsname |
\csname rmisbold#5\endcsname |
\assignfonts{#1}% |
\csname assignfonts#1\endcsname |
\resetmathfonts |
\resetmathfonts |
\setleading{#4}% |
\setleading{#4}% |
}} |
}} |
Line 2687 end
|
Line 2643 end
|
% Check if we are currently using a typewriter font. Since all the |
% Check if we are currently using a typewriter font. Since all the |
% Computer Modern typewriter fonts have zero interword stretch (and |
% Computer Modern typewriter fonts have zero interword stretch (and |
% shrink), and it is reasonable to expect all typewriter fonts to have |
% shrink), and it is reasonable to expect all typewriter fonts to have |
% this property, we can check that font parameter. |
% this property, we can check that font parameter. #1 is what to |
% |
% print if we are indeed using \tt; #2 is what to print otherwise. |
\def\ifmonospace{\ifdim\fontdimen3\font=0pt } |
\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} |
|
|
|
% Same as above, but check for italic font. Actually this also catches |
|
% non-italic slanted fonts since it is impossible to distinguish them from |
|
% italic fonts. But since this is only used by $ and it uses \sl anyway |
|
% this is not a problem. |
|
\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} |
|
|
|
|
|
% Check if internal flag is clear, i.e. has not been @set. |
|
\def\ifflagclear#1#2#3{% |
|
\expandafter\ifx\csname SET#1\endcsname\relax |
|
#2\else#3\fi |
|
} |
|
|
{ |
{ |
\catcode`\'=\active |
\catcode`\'=\active |
Line 2698 end
|
Line 2667 end
|
\gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} |
\gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} |
\gdef\setregularquotes{\let`\lq \let'\rq} |
\gdef\setregularquotes{\let`\lq \let'\rq} |
} |
} |
|
\setregularquotes |
|
|
% Allow an option to not use regular directed right quote/apostrophe |
% output for ' in @code |
% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). |
% in tt font hex 0D (undirected) or 27 (curly right quote) |
% The undirected quote is ugly, so don't make it the default, but it |
|
% works for pasting with more pdf viewers (at least evince), the |
|
% lilypond developers report. xpdf does work with the regular 0x27. |
|
% |
% |
\def\codequoteright{% |
\def\codequoteright{% |
\ifmonospace |
\ifusingtt |
\expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax |
{\ifflagclear{txicodequoteundirected}% |
\expandafter\ifx\csname SETcodequoteundirected\endcsname\relax |
{\ifflagclear{codequoteundirected}% |
'% |
{'}% |
\else \char'15 \fi |
{\char"0D }}% |
\else \char'15 \fi |
{\char"0D }}% |
\else |
{'}% |
'% |
|
\fi |
|
} |
} |
% |
|
% and a similar option for the left quote char vs. a grave accent. |
% output for ` in @code |
% Modern fonts display ASCII 0x60 as a grave accent, so some people like |
% in tt font hex 12 (grave accent) or 60 (curly left quote) |
% the code environments to do likewise. |
% \relax disables Spanish ligatures ?` and !` of \tt font. |
% |
% |
\def\codequoteleft{% |
\def\codequoteleft{% |
\ifmonospace |
\ifusingtt |
\expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax |
{\ifflagclear{txicodequotebacktick}% |
\expandafter\ifx\csname SETcodequotebacktick\endcsname\relax |
{\ifflagclear{codequotebacktick}% |
% [Knuth] pp. 380,381,391 |
{\relax`}% |
% \relax disables Spanish ligatures ?` and !` of \tt font. |
{\char"12 }}% |
\relax`% |
{\char"12 }}% |
\else \char'22 \fi |
{\relax`}% |
\else \char'22 \fi |
|
\else |
|
\relax`% |
|
\fi |
|
} |
} |
|
|
% Commands to set the quote options. |
% Commands to set the quote options. |
Line 2750 end
|
Line 2711 end
|
\errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% |
\errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% |
\fi\fi |
\fi\fi |
} |
} |
% |
|
\parseargdef\codequotebacktick{% |
\parseargdef\codequotebacktick{% |
\def\temp{#1}% |
\def\temp{#1}% |
\ifx\temp\onword |
\ifx\temp\onword |
Line 2765 end
|
Line 2726 end
|
\fi\fi |
\fi\fi |
} |
} |
|
|
|
% Turn them on by default |
|
\let\SETtxicodequoteundirected = t |
|
\let\SETtxicodequotebacktick = t |
|
|
|
|
% [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} |
|
|
Line 2779 end
|
Line 2745 end
|
\def\dosmartslant#1#2{% |
\def\dosmartslant#1#2{% |
\ifusingtt |
\ifusingtt |
{{\ttsl #2}\let\next=\relax}% |
{{\ttsl #2}\let\next=\relax}% |
{\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% |
{\def\next{{#1#2}\smartitaliccorrection}}% |
\next |
\next |
} |
} |
\def\smartslanted{\dosmartslant\sl} |
\def\smartslanted{\dosmartslant\sl} |
\def\smartitalic{\dosmartslant\it} |
\def\smartitalic{\dosmartslant\it} |
|
|
% Output an italic correction unless \next (presumed to be the following |
% Output an italic correction unless the following character is such as |
% character) is such as not to need one. |
% not to need one. |
\def\smartitaliccorrection{% |
\def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx} |
|
\def\smartitaliccorrectionx{% |
\ifx\next,% |
\ifx\next,% |
\else\ifx\next-% |
\else\ifx\next-% |
\else\ifx\next.% |
\else\ifx\next.% |
Line 2798 end
|
Line 2765 end
|
\aftersmartic |
\aftersmartic |
} |
} |
|
|
% Unconditional use \ttsl, and no ic. @var is set to this for defuns. |
% @cite unconditionally uses \sl with \smartitaliccorrection. |
\def\ttslanted#1{{\ttsl #1}} |
\def\cite#1{{\sl #1}\smartitaliccorrection} |
|
|
% @cite is like \smartslanted except unconditionally use \sl. We never want |
|
% ttsl for book titles, do we? |
|
\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} |
|
|
|
|
% @var unconditionally uses \sl. This gives consistency for |
|
% parameter names whether they are in @def, @table @code or a |
|
% regular paragraph. |
|
% To get ttsl font for @var when used in code context, @set txicodevaristt. |
|
% The \null is to reset \spacefactor. |
\def\aftersmartic{} |
\def\aftersmartic{} |
\def\var#1{% |
\def\var#1{% |
\let\saveaftersmartic = \aftersmartic |
\let\saveaftersmartic = \aftersmartic |
\def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% |
\def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% |
\smartslanted{#1}% |
% |
|
\ifflagclear{txicodevaristt}% |
|
{\def\varnext{{{\sl #1}}\smartitaliccorrection}}% |
|
{\def\varnext{\smartslanted{#1}}}% |
|
\varnext |
} |
} |
|
|
|
% To be removed after next release |
|
\def\SETtxicodevaristt{}% @set txicodevaristt |
|
|
\let\i=\smartitalic |
\let\i=\smartitalic |
\let\slanted=\smartslanted |
\let\slanted=\smartslanted |
\let\dfn=\smartslanted |
\let\dfn=\smartslanted |
\let\emph=\smartitalic |
\let\emph=\smartitalic |
|
|
% Explicit font changes: @r, @sc, undocumented @ii. |
% @r for roman font, used for code comment |
\def\r#1{{\rm #1}} % roman font |
\def\r#1{{% |
|
\usenormaldash % get --, --- ligatures even if in @code |
|
\defcharsdefault % in case on def line |
|
\rm #1}} |
|
{\catcode`-=\active \gdef\usenormaldash{\let-\normaldash}} |
|
|
|
% @sc, undocumented @ii. |
\def\sc#1{{\smallcaps#1}} % smallcaps font |
\def\sc#1{{\smallcaps#1}} % smallcaps font |
\def\ii#1{{\it #1}} % italic font |
\def\ii#1{{\it #1}} % italic font |
|
|
Line 2829 end
|
Line 2810 end
|
% @sansserif, explicit sans. |
% @sansserif, explicit sans. |
\def\sansserif#1{{\sf #1}} |
\def\sansserif#1{{\sf #1}} |
|
|
% We can't just use \exhyphenpenalty, because that only has effect at |
\newif\iffrenchspacing |
% the end of a paragraph. Restore normal hyphenation at the end of the |
\frenchspacingfalse |
% group within which \nohyphenation is presumably called. |
|
% |
|
\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} |
|
\def\restorehyphenation{\hyphenchar\font = `- } |
|
|
|
% Set sfcode to normal for the chars that usually have another value. |
% Set sfcode to normal for the chars that usually have another value. |
% Can't use plain's \frenchspacing because it uses the `\x notation, and |
% Can't use plain's \frenchspacing because it uses the `\x notation, and |
Line 2842 end
|
Line 2819 end
|
% |
% |
\catcode`@=11 |
\catcode`@=11 |
\def\plainfrenchspacing{% |
\def\plainfrenchspacing{% |
\sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m |
\iffrenchspacing\else |
\sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m |
\frenchspacingtrue |
\def\endofsentencespacefactor{1000}% for @. and friends |
\sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m |
|
\sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m |
|
\def\endofsentencespacefactor{1000}% for @. and friends |
|
\fi |
} |
} |
\def\plainnonfrenchspacing{% |
\def\plainnonfrenchspacing{% |
\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 |
\iffrenchspacing |
\sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 |
\frenchspacingfalse |
\def\endofsentencespacefactor{3000}% for @. and friends |
\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 |
|
\sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 |
|
\def\endofsentencespacefactor{3000}% for @. and friends |
|
\fi |
} |
} |
\catcode`@=\other |
\catcode`@=\other |
\def\endofsentencespacefactor{3000}% default |
\def\endofsentencespacefactor{3000}% default |
|
|
|
% @frenchspacing on|off says whether to put extra space after punctuation. |
|
% |
|
\def\onword{on} |
|
\def\offword{off} |
|
% |
|
\let\frenchspacingsetting\plainnonfrenchspacing % used in output routine |
|
\parseargdef\frenchspacing{% |
|
\def\temp{#1}% |
|
\ifx\temp\onword \let\frenchspacingsetting\plainfrenchspacing |
|
\else\ifx\temp\offword \let\frenchspacingsetting\plainnonfrenchspacing |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @frenchspacing option `\temp', must be on|off}% |
|
\fi\fi |
|
\frenchspacingsetting |
|
} |
|
|
|
|
% @t, explicit typewriter. |
% @t, explicit typewriter. |
\def\t#1{% |
\def\t#1{% |
{\tt \plainfrenchspacing #1}% |
{\tt \defcharsdefault \plainfrenchspacing #1}% |
\null |
\null |
} |
} |
|
|
Line 2877 end
|
Line 2878 end
|
% Switch to typewriter. |
% Switch to typewriter. |
\tt |
\tt |
% |
% |
% But `\ ' produces the large typewriter interword space. |
% `\ ' produces the large typewriter interword space. |
\def\ {{\spaceskip = 0pt{} }}% |
\def\ {{\spaceskip = 0pt{} }}% |
% |
% |
% Turn off hyphenation. |
|
\nohyphenation |
|
% |
|
\plainfrenchspacing |
\plainfrenchspacing |
#1% |
#1% |
}% |
}% |
\null % reset spacefactor to 1000 |
\null % reset spacefactor to 1000 |
} |
} |
|
|
% We *must* turn on hyphenation at `-' and `_' in @code. |
% This is for LuaTeX: It is not sufficient to disable hyphenation at |
% (But see \codedashfinish below.) |
% explicit dashes by setting `\hyphenchar` to -1. |
|
\def\dashnobreak{% |
|
\normaldash |
|
\penalty 10000 } |
|
|
|
% We must turn on hyphenation at `-' and `_' in @code. |
% Otherwise, it is too hard to avoid overfull hboxes |
% Otherwise, it is too hard to avoid overfull hboxes |
% in the Emacs manual, the Library manual, etc. |
% in the Emacs manual, the Library manual, etc. |
|
% We explicitly allow hyphenation at these characters |
|
% using \discretionary. |
% |
% |
% Unfortunately, TeX uses one parameter (\hyphenchar) to control |
% Hyphenation at - and hyphenation within words was turned off |
% both hyphenation at - and hyphenation within words. |
% by default for the tt fonts using the \hyphenchar parameter of TeX. |
% We must therefore turn them both off (\tclose does that) |
|
% and arrange explicitly to hyphenate at a dash. -- rms. |
|
{ |
{ |
\catcode`\-=\active \catcode`\_=\active |
\catcode`\-=\active \catcode`\_=\active |
\catcode`\'=\active \catcode`\`=\active |
\catcode`\'=\active \catcode`\`=\active |
Line 2910 end
|
Line 2913 end
|
\let-\codedash |
\let-\codedash |
\let_\codeunder |
\let_\codeunder |
\else |
\else |
\let-\normaldash |
\let-\dashnobreak |
\let_\realunder |
\let_\realunder |
\fi |
\fi |
% Given -foo (with a single dash), we do not want to allow a break |
|
% after the hyphen. |
|
\global\let\codedashprev=\codedash |
|
% |
|
\codex |
\codex |
} |
} |
% |
% |
Line 2926 end
|
Line 2925 end
|
% |
% |
% Now, output a discretionary to allow a line break, unless |
% Now, output a discretionary to allow a line break, unless |
% (a) the next character is a -, or |
% (a) the next character is a -, or |
% (b) the preceding character is a -. |
% (b) the preceding character is a -, or |
|
% (c) we are at the start of the string. |
|
% In both cases (b) and (c), \codedashnobreak should be set to \codedash. |
|
% |
% E.g., given --posix, we do not want to allow a break after either -. |
% E.g., given --posix, we do not want to allow a break after either -. |
% Given --foo-bar, we do want to allow a break between the - and the b. |
% Given --foo-bar, we do want to allow a break between the - and the b. |
\ifx\next\codedash \else |
\ifx\next\codedash \else |
\ifx\codedashprev\codedash |
\ifx\codedashnobreak\codedash |
\else \discretionary{}{}{}\fi |
\else \discretionary{}{}{}\fi |
\fi |
\fi |
% we need the space after the = for the case when \next itself is a |
% we need the space after the = for the case when \next itself is a |
% space token; it would get swallowed otherwise. As in @code{- a}. |
% space token; it would get swallowed otherwise. As in @code{- a}. |
\global\let\codedashprev= \next |
\global\let\codedashnobreak= \next |
} |
} |
} |
} |
\def\normaldash{-} |
\def\normaldash{-} |
% |
% |
\def\codex #1{\tclose{#1}\endgroup} |
\def\codex #1{\tclose{% |
|
% Given -foo (with a single dash), we do not want to allow a break |
|
% after the -. \codedashnobreak is set to the first character in |
|
% @code. |
|
\futurelet\codedashnobreak\relax |
|
#1% |
|
}\endgroup} |
|
|
\def\codeunder{% |
\def\codeunder{% |
% this is all so @math{@code{var_name}+1} can work. In math mode, _ |
% this is all so @math{@code{var_name}+1} can work. In math mode, _ |
Line 3171 end
|
Line 3179 end
|
% Default is `distinct'. |
% Default is `distinct'. |
\kbdinputstyle distinct |
\kbdinputstyle distinct |
|
|
% @kbd is like @code, except that if the argument is just one @key command, |
\def\kbd#1{% |
% then @kbd has no effect. |
\tclose{\kbdfont\setcodequotes#1}% |
\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} |
|
|
|
\def\xkey{\key} |
|
\def\kbdsub#1#2#3\par{% |
|
\def\one{#1}\def\three{#3}\def\threex{??}% |
|
\ifx\one\xkey\ifx\threex\three \key{#2}% |
|
\else{\tclose{\kbdfont\setcodequotes\look}}\fi |
|
\else{\tclose{\kbdfont\setcodequotes\look}}\fi |
|
} |
} |
|
|
% definition of @key that produces a lozenge. Doesn't adjust to text size. |
% definition of @key that produces a lozenge. Doesn't adjust to text size. |
Line 3193 end
|
Line 3193 end
|
% \kern-0.4pt\hrule}% |
% \kern-0.4pt\hrule}% |
% \kern-.06em\raise0.4pt\hbox{\angleright}}}} |
% \kern-.06em\raise0.4pt\hbox{\angleright}}}} |
|
|
% definition of @key with no lozenge. If the current font is already |
% definition of @key with no lozenge. |
% monospace, don't change it; that way, we respect @kbdinputstyle. But |
% |
% if it isn't monospace, then use \tt. |
\def\key#1{{\setregularquotes \tt #1}\null} |
% |
|
\def\key#1{{\setregularquotes |
|
\nohyphenation |
|
\ifmonospace\else\tt\fi |
|
#1}\null} |
|
|
|
% @clicksequence{File @click{} Open ...} |
% @clicksequence{File @click{} Open ...} |
\def\clicksequence#1{\begingroup #1\endgroup} |
\def\clicksequence#1{\begingroup #1\endgroup} |
Line 3403 $$%
|
Line 3398 $$%
|
\let\atchar=\@ |
\let\atchar=\@ |
|
|
% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. |
% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. |
\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}} |
\def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}} |
\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}} |
\def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}} |
\let\{=\lbracechar |
\let\{=\lbracechar |
\let\}=\rbracechar |
\let\}=\rbracechar |
|
|
Line 3458 $$%
|
Line 3453 $$%
|
% Revert to plain's \scriptsize, which is 7pt. |
% Revert to plain's \scriptsize, which is 7pt. |
\count255=\the\fam $\fam\count255 \scriptstyle A$% |
\count255=\the\fam $\fam\count255 \scriptstyle A$% |
\else |
\else |
% For 11pt, we can use our lllsize. |
\ifx\curfontsize\smallword |
\switchtolllsize A% |
% For footnotes and indices |
|
\count255=\the\fam $\fam\count255 \scriptstyle A$% |
|
\else |
|
% For 11pt, we can use our lllsize. |
|
\switchtolllsize A% |
|
\fi |
\fi |
\fi |
}% |
}% |
\vss |
\vss |
Line 3467 $$%
|
Line 3467 $$%
|
\kern-.15em |
\kern-.15em |
\TeX |
\TeX |
} |
} |
|
\def\smallword{small} |
|
|
% Some math mode symbols. Define \ensuremath to switch into math mode |
% Some math mode symbols. Define \ensuremath to switch into math mode |
% unless we are already there. Expansion tricks may not be needed here, |
% unless we are already there. Expansion tricks may not be needed here, |
Line 3545 $$%
|
Line 3546 $$%
|
|
|
% @pounds{} is a sterling sign, which Knuth put in the CM italic font. |
% @pounds{} is a sterling sign, which Knuth put in the CM italic font. |
% |
% |
\def\pounds{\ifmonospace{\ecfont\char"BF}\else{\it\$}\fi} |
\def\pounds{{\ifusingtt{\ecfont\char"BF}{\it\$}}} |
|
|
% @euro{} comes from a separate font, depending on the current style. |
% @euro{} comes from a separate font, depending on the current style. |
% We use the free feym* fonts from the eurosym package by Henrik |
% We use the free feym* fonts from the eurosym package by Henrik |
Line 3614 $$%
|
Line 3615 $$%
|
\def\quotedblbase{{\ecfont \char"12}} |
\def\quotedblbase{{\ecfont \char"12}} |
\def\quotesinglbase{{\ecfont \char"0D}} |
\def\quotesinglbase{{\ecfont \char"0D}} |
% |
% |
|
\def\L{{\ecfont \char"8A}} % L with stroke |
|
\def\l{{\ecfont \char"AA}} % l with stroke |
|
% |
% This positioning is not perfect (see the ogonek LaTeX package), but |
% This positioning is not perfect (see the ogonek LaTeX package), but |
% we have the precomposed glyphs for the most common cases. We put the |
% we have the precomposed glyphs for the most common cases. We put the |
% tests to use those glyphs in the single \ogonek macro so we have fewer |
% tests to use those glyphs in the single \ogonek macro so we have fewer |
Line 3656 $$%
|
Line 3660 $$%
|
% hopefully nobody will notice/care. |
% hopefully nobody will notice/care. |
\edef\ecsize{\csname\curfontsize ecsize\endcsname}% |
\edef\ecsize{\csname\curfontsize ecsize\endcsname}% |
\edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% |
\edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% |
\ifmonospace |
\ifusingtt |
% typewriter: |
% typewriter: |
\font\thisecfont = #1ctt\ecsize \space at \nominalsize |
{\font\thisecfont = #1ctt\ecsize \space at \nominalsize}% |
\else |
% else |
\ifx\curfontstyle\bfstylename |
{\ifx\curfontstyle\bfstylename |
% bold: |
% bold: |
\font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize |
\font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize |
\else |
\else |
% regular: |
% regular: |
\font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize |
\font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize |
\fi |
\fi}% |
\fi |
|
\thisecfont |
\thisecfont |
} |
} |
|
|
Line 3683 $$%
|
Line 3686 $$%
|
|
|
% @textdegree - the normal degrees sign. |
% @textdegree - the normal degrees sign. |
% |
% |
\def\textdegree{$^\circ$} |
\def\textdegree{% |
|
\ifmmode ^\circ |
|
\else {\tcfont \char 176}% |
|
\fi} |
|
|
% Laurent Siebenmann reports \Orb undefined with: |
% Laurent Siebenmann reports \Orb undefined with: |
% 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 |
Line 3700 $$%
|
Line 3706 $$%
|
% only change font for tt for correct kerning and to avoid using |
% only change font for tt for correct kerning and to avoid using |
% \ecfont unless necessary. |
% \ecfont unless necessary. |
\def\quotedblleft{% |
\def\quotedblleft{% |
\ifmonospace{\ecfont\char"10}\else{\char"5C}\fi |
\ifusingtt{{\ecfont\char"10}}{{\char"5C}}% |
} |
} |
|
|
\def\quotedblright{% |
\def\quotedblright{% |
\ifmonospace{\ecfont\char"11}\else{\char`\"}\fi |
\ifusingtt{{\ecfont\char"11}}{{\char`\"}}% |
} |
} |
|
|
|
|
Line 3729 $$%
|
Line 3735 $$%
|
want the contents after the title page.}}% |
want the contents after the title page.}}% |
|
|
\parseargdef\shorttitlepage{% |
\parseargdef\shorttitlepage{% |
\begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% |
{\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% |
\endgroup\page\hbox{}\page} |
\endgroup\page\hbox{}\page}\pageone} |
|
|
\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. |
\begingroup |
\begingroup |
\parindent=0pt \textfonts |
\parindent=0pt \textfonts |
|
\headingsoff |
% Leave some space at the very top of the page. |
% Leave some space at the very top of the page. |
\vglue\titlepagetopglue |
\vglue\titlepagetopglue |
% No rule at page bottom unless we print one at the top with @title. |
% No rule at page bottom unless we print one at the top with @title. |
Line 3763 $$%
|
Line 3770 $$%
|
% If we use the new definition of \page, we always get a blank page |
% If we use the new definition of \page, we always get a blank page |
% after the title page, which we certainly don't want. |
% after the title page, which we certainly don't want. |
\oldpage |
\oldpage |
|
\pageone |
\endgroup |
\endgroup |
% |
% |
% Need this before the \...aftertitlepage checks so that if they are |
|
% in effect the toc pages will come out with page numbers. |
|
\HEADINGSon |
|
} |
} |
|
|
\def\finishtitlepage{% |
\def\finishtitlepage{% |
Line 3834 $$%
|
Line 3839 $$%
|
\newtoks\oddfootline % footline on odd pages |
\newtoks\oddfootline % footline on odd pages |
|
|
% Now make \makeheadline and \makefootline in Plain TeX use those variables |
% Now make \makeheadline and \makefootline in Plain TeX use those variables |
\headline={{\textfonts\rm |
\headline={{\textfonts\rm\frenchspacingsetting |
\ifchapterpage |
\ifchapterpage |
\ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi |
\ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi |
\else |
\else |
\ifodd\pageno\the\oddheadline\else\the\evenheadline\fi |
\ifodd\pageno\the\oddheadline\else\the\evenheadline\fi |
\fi}} |
\fi}} |
|
|
\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline |
\footline={{\textfonts\rm\frenchspacingsetting |
\else \the\evenfootline \fi}\HEADINGShook} |
\ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}% |
|
\HEADINGShook} |
\let\HEADINGShook=\relax |
\let\HEADINGShook=\relax |
|
|
% Commands to set those variables. |
% Commands to set those variables. |
Line 3935 $$%
|
Line 3941 $$%
|
} |
} |
|
|
\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting |
\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting |
\HEADINGSoff % it's the default |
|
|
|
% When we turn headings on, set the page number to 1. |
% Set the page number to 1. |
\def\pageone{ |
\def\pageone{ |
\global\pageno=1 |
\global\pageno=1 |
\global\arabiccount = \pagecount |
\global\arabiccount = \pagecount |
} |
} |
|
|
|
\let\contentsalignmacro = \chappager |
|
|
|
% \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon |
|
|
% 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 |
% title on inside top of left hand pages, and page numbers on outside top |
% title on inside top of left hand pages, and page numbers on outside top |
% edge of all pages. |
% edge of all pages. |
\def\HEADINGSdouble{% |
\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble} |
\pageone |
|
\HEADINGSdoublex |
|
} |
|
\let\contentsalignmacro = \chappager |
|
|
|
% For single-sided printing, chapter title goes across top left of page, |
|
% page number on top right. |
|
\def\HEADINGSsingle{% |
|
\pageone |
|
\HEADINGSsinglex |
|
} |
|
\def\HEADINGSon{\HEADINGSdouble} |
|
|
|
\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} |
|
\let\HEADINGSdoubleafter=\HEADINGSafter |
\let\HEADINGSdoubleafter=\HEADINGSafter |
\def\HEADINGSdoublex{% |
\def\HEADINGSdouble{% |
\global\evenfootline={\hfil} |
\global\evenfootline={\hfil} |
\global\oddfootline={\hfil} |
\global\oddfootline={\hfil} |
\global\evenheadline={\line{\folio\hfil\thistitle}} |
\global\evenheadline={\line{\folio\hfil\thistitle}} |
\global\oddheadline={\line{\thischapter\hfil\folio}} |
\global\oddheadline={\line{\thischapter\hfil\folio}} |
\global\evenchapheadline={\line{\folio\hfil}} |
\global\evenchapheadline={\line{\folio\hfil\thistitle}} |
\global\oddchapheadline={\line{\hfil\folio}} |
\global\oddchapheadline={\line{\hfil\folio}} |
\global\let\contentsalignmacro = \chapoddpage |
\global\let\contentsalignmacro = \chapoddpage |
} |
} |
|
|
\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} |
% For single-sided printing, chapter title goes across top left of page, |
\def\HEADINGSsinglex{% |
% page number on top right. |
|
\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle} |
|
\def\HEADINGSsingle{% |
\global\evenfootline={\hfil} |
\global\evenfootline={\hfil} |
\global\oddfootline={\hfil} |
\global\oddfootline={\hfil} |
\global\evenheadline={\line{\thischapter\hfil\folio}} |
\global\evenheadline={\line{\thischapter\hfil\folio}} |
Line 3986 $$%
|
Line 3983 $$%
|
|
|
% for @setchapternewpage off |
% for @setchapternewpage off |
\def\HEADINGSsinglechapoff{% |
\def\HEADINGSsinglechapoff{% |
\pageone |
|
\global\evenfootline={\hfil} |
\global\evenfootline={\hfil} |
\global\oddfootline={\hfil} |
\global\oddfootline={\hfil} |
\global\evenheadline={\line{\thischapter\hfil\folio}} |
\global\evenheadline={\line{\thischapter\hfil\folio}} |
Line 4356 $$%
|
Line 4352 $$%
|
% undo it ourselves. |
% undo it ourselves. |
\def\headitemfont{\b}% for people to use in the template row; not changeable |
\def\headitemfont{\b}% for people to use in the template row; not changeable |
\def\headitem{% |
\def\headitem{% |
\checkenv\multitable |
\crcr % must appear first |
\crcr |
|
\gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings |
\gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings |
\global\everytab={\bf}% can't use \headitemfont since the parsing differs |
\global\everytab={\bf}% can't use \headitemfont since the parsing differs |
\the\everytab % for the first item |
\the\everytab % for the first item |
Line 4419 $$%
|
Line 4414 $$%
|
% Find the correct column width |
% Find the correct column width |
\hsize=\expandafter\csname col\the\colcount\endcsname |
\hsize=\expandafter\csname col\the\colcount\endcsname |
% |
% |
\rightskip=0pt |
\advance\rightskip by -1\rightskip % Zero leaving only any stretch |
\ifnum\colcount=1 |
\ifnum\colcount=1 |
\advance\hsize by\leftskip % Add indent of surrounding text |
\advance\hsize by\leftskip % Add indent of surrounding text |
\else |
\else |
Line 4442 $$%
|
Line 4437 $$%
|
|
|
\message{conditionals,} |
\message{conditionals,} |
|
|
% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, |
% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @ifnotplaintext, |
% @ifnotxml always succeed. They currently do nothing; we don't |
% @ifnotxml always succeed. They currently do nothing; we don't |
% attempt to check whether the conditionals are properly nested. But we |
% attempt to check whether the conditionals are properly nested. But we |
% have to remember that they are conditionals, so that @end doesn't |
% have to remember that they are conditionals, so that @end doesn't |
Line 4456 $$%
|
Line 4451 $$%
|
\makecond{ifnotdocbook} |
\makecond{ifnotdocbook} |
\makecond{ifnothtml} |
\makecond{ifnothtml} |
\makecond{ifnotinfo} |
\makecond{ifnotinfo} |
|
\makecond{ifnotlatex} |
\makecond{ifnotplaintext} |
\makecond{ifnotplaintext} |
\makecond{ifnotxml} |
\makecond{ifnotxml} |
|
|
Line 4468 $$%
|
Line 4464 $$%
|
\def\ifdocbook{\doignore{ifdocbook}} |
\def\ifdocbook{\doignore{ifdocbook}} |
\def\ifhtml{\doignore{ifhtml}} |
\def\ifhtml{\doignore{ifhtml}} |
\def\ifinfo{\doignore{ifinfo}} |
\def\ifinfo{\doignore{ifinfo}} |
|
\def\iflatex{\doignore{iflatex}} |
\def\ifnottex{\doignore{ifnottex}} |
\def\ifnottex{\doignore{ifnottex}} |
\def\ifplaintext{\doignore{ifplaintext}} |
\def\ifplaintext{\doignore{ifplaintext}} |
\def\ifxml{\doignore{ifxml}} |
\def\ifxml{\doignore{ifxml}} |
\def\ignore{\doignore{ignore}} |
\def\ignore{\doignore{ignore}} |
|
\def\latex{\doignore{latex}} |
\def\menu{\doignore{menu}} |
\def\menu{\doignore{menu}} |
\def\xml{\doignore{xml}} |
\def\xml{\doignore{xml}} |
|
|
Line 4710 $$%
|
Line 4708 $$%
|
% except not \outer, so it can be used within macros and \if's. |
% except not \outer, so it can be used within macros and \if's. |
\edef\newwrite{\makecsname{ptexnewwrite}} |
\edef\newwrite{\makecsname{ptexnewwrite}} |
|
|
% \newindex {foo} defines an index named IX. |
% \newindex {IX} defines an index named IX. |
% It automatically defines \IXindex such that |
% It automatically defines \IXindex such that |
% \IXindex ...rest of line... puts an entry in the index IX. |
% \IXindex ...rest of line... puts an entry in the index IX. |
% It also defines \IXindfile to be the number of the output channel for |
% It also defines \IXindfile to be the number of the output channel for |
% the file that accumulates this index. The file's extension is IX. |
% the file that accumulates this index. The file's extension is IX. |
% The name of an index should be no more than 2 characters long |
|
% for the sake of vms. |
|
% |
% |
\def\newindex#1{% |
\def\newindex#1{% |
\expandafter\chardef\csname#1indfile\endcsname=0 |
\expandafter\chardef\csname#1indfile\endcsname=0 |
Line 4779 $$%
|
Line 4775 $$%
|
\def\docodeindexxxx #1{\docind{\indexname}{#1}} |
\def\docodeindexxxx #1{\docind{\indexname}{#1}} |
|
|
|
|
% Used for the aux, toc and index files to prevent expansion of Texinfo |
|
% commands. |
|
% |
|
\def\atdummies{% |
|
\definedummyletter\@% |
|
\definedummyletter\ % |
|
\definedummyletter\{% |
|
\definedummyletter\}% |
|
\definedummyletter\&% |
|
% |
|
% Do the redefinitions. |
|
\definedummies |
|
\otherbackslash |
|
} |
|
|
|
% \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 |
Line 4809 $$%
|
Line 4790 $$%
|
% |
% |
\def\definedummyword #1{\def#1{\string#1\space}}% |
\def\definedummyword #1{\def#1{\string#1\space}}% |
\def\definedummyletter#1{\def#1{\string#1}}% |
\def\definedummyletter#1{\def#1{\string#1}}% |
\let\definedummyaccent\definedummyletter |
|
|
|
% Called from \atdummies to prevent the expansion of commands. |
% Used for the aux, toc and index files to prevent expansion of Texinfo |
|
% commands. Most of the commands are controlled through the |
|
% \ifdummies conditional. |
% |
% |
\def\definedummies{% |
\def\atdummies{% |
|
\dummiestrue |
% |
% |
\let\commondummyword\definedummyword |
\definedummyletter\@% |
\let\commondummyletter\definedummyletter |
\definedummyletter\ % |
\let\commondummyaccent\definedummyaccent |
\definedummyletter\{% |
\commondummiesnofonts |
\definedummyletter\}% |
|
\definedummyletter\&% |
% |
% |
\definedummyletter\_% |
\definedummyletter\_% |
\definedummyletter\-% |
\definedummyletter\-% |
% |
% |
% Non-English letters. |
|
\definedummyword\AA |
|
\definedummyword\AE |
|
\definedummyword\DH |
|
\definedummyword\L |
|
\definedummyword\O |
|
\definedummyword\OE |
|
\definedummyword\TH |
|
\definedummyword\aa |
|
\definedummyword\ae |
|
\definedummyword\dh |
|
\definedummyword\exclamdown |
|
\definedummyword\l |
|
\definedummyword\o |
|
\definedummyword\oe |
|
\definedummyword\ordf |
|
\definedummyword\ordm |
|
\definedummyword\questiondown |
|
\definedummyword\ss |
|
\definedummyword\th |
|
% |
|
% Although these internal commands shouldn't show up, sometimes they do. |
|
\definedummyword\bf |
|
\definedummyword\gtr |
|
\definedummyword\hat |
|
\definedummyword\less |
|
\definedummyword\sf |
|
\definedummyword\sl |
|
\definedummyword\tclose |
|
\definedummyword\tt |
|
% |
|
\definedummyword\LaTeX |
|
\definedummyword\TeX |
|
% |
|
% Assorted special characters. |
|
\definedummyword\ampchar |
|
\definedummyword\atchar |
|
\definedummyword\arrow |
|
\definedummyword\backslashchar |
|
\definedummyword\bullet |
|
\definedummyword\comma |
|
\definedummyword\copyright |
|
\definedummyword\registeredsymbol |
|
\definedummyword\dots |
|
\definedummyword\enddots |
|
\definedummyword\entrybreak |
|
\definedummyword\equiv |
|
\definedummyword\error |
|
\definedummyword\euro |
|
\definedummyword\expansion |
|
\definedummyword\geq |
|
\definedummyword\guillemetleft |
|
\definedummyword\guillemetright |
|
\definedummyword\guilsinglleft |
|
\definedummyword\guilsinglright |
|
\definedummyword\lbracechar |
|
\definedummyword\leq |
|
\definedummyword\mathopsup |
|
\definedummyword\minus |
|
\definedummyword\ogonek |
|
\definedummyword\pounds |
|
\definedummyword\point |
|
\definedummyword\print |
|
\definedummyword\quotedblbase |
|
\definedummyword\quotedblleft |
|
\definedummyword\quotedblright |
|
\definedummyword\quoteleft |
|
\definedummyword\quoteright |
|
\definedummyword\quotesinglbase |
|
\definedummyword\rbracechar |
|
\definedummyword\result |
|
\definedummyword\sub |
|
\definedummyword\sup |
|
\definedummyword\textdegree |
|
% |
|
\definedummyword\subentry |
\definedummyword\subentry |
% |
% |
% We want to disable all macros so that they are not expanded by \write. |
% We want to disable all macros so that they are not expanded by \write. |
|
\let\commondummyword\definedummyword |
\macrolist |
\macrolist |
\let\value\dummyvalue |
\let\value\dummyvalue |
% |
% |
\normalturnoffactive |
\turnoffactive |
} |
} |
|
|
% \commondummiesnofonts: common to \definedummies and \indexnofonts. |
\newif\ifdummies |
% Define \commondummyletter, \commondummyaccent and \commondummyword before |
\newif\ifindexnofonts |
% using. Used for accents, font commands, and various control letters. |
|
% |
\def\commondummyletter#1{% |
\def\commondummiesnofonts{% |
\expandafter\let\csname\string#1:impl\endcsname#1% |
% Control letters and accents. |
\edef#1{% |
|
\noexpand\ifindexnofonts |
|
% empty expansion |
|
\noexpand\else |
|
\noexpand\ifdummies\string#1% |
|
\noexpand\else |
|
\noexpand\jumptwofi % dispose of the \fi |
|
\expandafter\noexpand\csname\string#1:impl\endcsname |
|
\noexpand\fi |
|
\noexpand\fi}% |
|
} |
|
|
|
\def\commondummyaccent#1{% |
|
\expandafter\let\csname\string#1:impl\endcsname#1% |
|
\edef#1{% |
|
\noexpand\ifindexnofonts |
|
\noexpand\expandafter % dispose of \else ... \fi |
|
\noexpand\asis |
|
\noexpand\else |
|
\noexpand\ifdummies\string#1% |
|
\noexpand\else |
|
\noexpand\jumptwofi % dispose of the \fi |
|
\expandafter\noexpand\csname\string#1:impl\endcsname |
|
\noexpand\fi |
|
\noexpand\fi}% |
|
} |
|
|
|
% Like \commondummyaccent but add a \space at the end of the dummy expansion |
|
% #2 is the expansion used for \indexnofonts. #2 is always followed by |
|
% \asis to remove a pair of following braces. |
|
\def\commondummyword#1#2{% |
|
\expandafter\let\csname\string#1:impl\endcsname#1% |
|
\expandafter\def\csname\string#1:ixnf\endcsname{#2\asis}% |
|
\edef#1{% |
|
\noexpand\ifindexnofonts |
|
\noexpand\expandafter % dispose of \else ... \fi |
|
\expandafter\noexpand\csname\string#1:ixnf\endcsname |
|
\noexpand\else |
|
\noexpand\ifdummies\string#1\space |
|
\noexpand\else |
|
\noexpand\jumptwofi % dispose of the \fi \fi |
|
\expandafter\noexpand\csname\string#1:impl\endcsname |
|
\noexpand\fi |
|
\noexpand\fi}% |
|
} |
|
\def\jumptwofi#1\fi\fi{\fi\fi#1} |
|
|
|
% For \atdummies and \indexnofonts. \atdummies sets |
|
% \dummiestrue and \indexnofonts sets \indexnofontstrue. |
|
\def\definedummies{ |
|
% @-sign is always an escape character when reading auxiliary files |
|
\escapechar = `\@ |
|
% |
\commondummyletter\!% |
\commondummyletter\!% |
\commondummyaccent\"% |
\commondummyaccent\"% |
\commondummyaccent\'% |
\commondummyaccent\'% |
Line 4926 $$%
|
Line 4888 $$%
|
\commondummyaccent\^% |
\commondummyaccent\^% |
\commondummyaccent\`% |
\commondummyaccent\`% |
\commondummyaccent\~% |
\commondummyaccent\~% |
\commondummyword\u |
% |
\commondummyword\v |
% Control letters and accents. |
\commondummyword\H |
\commondummyword\u {}% |
\commondummyword\dotaccent |
\commondummyword\v {}% |
\commondummyword\ogonek |
\commondummyword\H {}% |
\commondummyword\ringaccent |
\commondummyword\dotaccent {}% |
\commondummyword\tieaccent |
\commondummyword\ogonek {}% |
\commondummyword\ubaraccent |
\commondummyword\ringaccent {}% |
\commondummyword\udotaccent |
\commondummyword\tieaccent {}% |
\commondummyword\dotless |
\commondummyword\ubaraccent {}% |
|
\commondummyword\udotaccent {}% |
|
\commondummyword\dotless {}% |
% |
% |
% Texinfo font commands. |
% Texinfo font commands. |
\commondummyword\b |
\commondummyword\b {}% |
\commondummyword\i |
\commondummyword\i {}% |
\commondummyword\r |
\commondummyword\r {}% |
\commondummyword\sansserif |
\commondummyword\sansserif {}% |
\commondummyword\sc |
\commondummyword\sc {}% |
\commondummyword\slanted |
\commondummyword\slanted {}% |
\commondummyword\t |
\commondummyword\t {}% |
% |
% |
% Commands that take arguments. |
% Commands that take arguments. |
\commondummyword\abbr |
\commondummyword\abbr {}% |
\commondummyword\acronym |
\commondummyword\acronym {}% |
\commondummyword\anchor |
\commondummyword\anchor {}% |
\commondummyword\cite |
\commondummyword\cite {}% |
\commondummyword\code |
\commondummyword\code {}% |
\commondummyword\command |
\commondummyword\command {}% |
\commondummyword\dfn |
\commondummyword\dfn {}% |
\commondummyword\dmn |
\commondummyword\dmn {}% |
\commondummyword\email |
\commondummyword\email {}% |
\commondummyword\emph |
\commondummyword\emph {}% |
\commondummyword\env |
\commondummyword\env {}% |
\commondummyword\file |
\commondummyword\file {}% |
\commondummyword\image |
\commondummyword\image {}% |
\commondummyword\indicateurl |
\commondummyword\indicateurl{}% |
\commondummyword\inforef |
\commondummyword\inforef {}% |
\commondummyword\kbd |
\commondummyword\kbd {}% |
\commondummyword\key |
\commondummyword\key {}% |
\commondummyword\math |
\commondummyword\link {}% |
\commondummyword\option |
\commondummyword\math {}% |
\commondummyword\pxref |
\commondummyword\option {}% |
\commondummyword\ref |
\commondummyword\pxref {}% |
\commondummyword\samp |
\commondummyword\ref {}% |
\commondummyword\strong |
\commondummyword\samp {}% |
\commondummyword\tie |
\commondummyword\strong {}% |
\commondummyword\U |
\commondummyword\tie {}% |
\commondummyword\uref |
\commondummyword\U {}% |
\commondummyword\url |
\commondummyword\uref {}% |
\commondummyword\var |
\commondummyword\url {}% |
\commondummyword\verb |
\commondummyword\var {}% |
\commondummyword\w |
\commondummyword\verb {}% |
\commondummyword\xref |
\commondummyword\w {}% |
|
\commondummyword\xref {}% |
|
% |
|
\commondummyword\AA {AA}% |
|
\commondummyword\AE {AE}% |
|
\commondummyword\DH {DZZ}% |
|
\commondummyword\L {L}% |
|
\commondummyword\O {O}% |
|
\commondummyword\OE {OE}% |
|
\commondummyword\TH {TH}% |
|
\commondummyword\aa {aa}% |
|
\commondummyword\ae {ae}% |
|
\commondummyword\dh {dzz}% |
|
\commondummyword\exclamdown {!}% |
|
\commondummyword\l {l}% |
|
\commondummyword\o {o}% |
|
\commondummyword\oe {oe}% |
|
\commondummyword\ordf {a}% |
|
\commondummyword\ordm {o}% |
|
\commondummyword\questiondown {?}% |
|
\commondummyword\ss {ss}% |
|
\commondummyword\th {th}% |
|
% |
|
\commondummyword\LaTeX {LaTeX}% |
|
\commondummyword\TeX {TeX}% |
|
% |
|
% Assorted special characters. |
|
\commondummyword\ampchar {\normalamp}% |
|
\commondummyword\atchar {\@}% |
|
\commondummyword\arrow {->}% |
|
\commondummyword\backslashchar {\realbackslash}% |
|
\commondummyword\bullet {bullet}% |
|
\commondummyword\comma {,}% |
|
\commondummyword\copyright {copyright}% |
|
\commondummyword\dots {...}% |
|
\commondummyword\enddots {...}% |
|
\commondummyword\entrybreak {}% |
|
\commondummyword\equiv {===}% |
|
\commondummyword\error {error}% |
|
\commondummyword\euro {euro}% |
|
\commondummyword\expansion {==>}% |
|
\commondummyword\geq {>=}% |
|
\commondummyword\guillemetleft {<<}% |
|
\commondummyword\guillemetright {>>}% |
|
\commondummyword\guilsinglleft {<}% |
|
\commondummyword\guilsinglright {>}% |
|
\commondummyword\lbracechar {\{}% |
|
\commondummyword\leq {<=}% |
|
\commondummyword\mathopsup {sup}% |
|
\commondummyword\minus {-}% |
|
\commondummyword\pounds {pounds}% |
|
\commondummyword\point {.}% |
|
\commondummyword\print {-|}% |
|
\commondummyword\quotedblbase {"}% |
|
\commondummyword\quotedblleft {"}% |
|
\commondummyword\quotedblright {"}% |
|
\commondummyword\quoteleft {`}% |
|
\commondummyword\quoteright {'}% |
|
\commondummyword\quotesinglbase {,}% |
|
\commondummyword\rbracechar {\}}% |
|
\commondummyword\registeredsymbol {R}% |
|
\commondummyword\result {=>}% |
|
\commondummyword\sub {}% |
|
\commondummyword\sup {}% |
|
\commondummyword\textdegree {o}% |
} |
} |
|
|
\let\indexlbrace\relax |
\let\indexlbrace\relax |
Line 4995 $$%
|
Line 5023 $$%
|
\catcode`\-=13 |
\catcode`\-=13 |
\catcode`\`=13 |
\catcode`\`=13 |
\gdef\indexnonalnumdisappear{% |
\gdef\indexnonalnumdisappear{% |
\expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else |
\ifflagclear{txiindexlquoteignore}{}{% |
% @set txiindexlquoteignore makes us ignore left quotes in the sort term. |
% @set txiindexlquoteignore makes us ignore left quotes in the sort term. |
% (Introduced for FSFS 2nd ed.) |
% (Introduced for FSFS 2nd ed.) |
\let`=\empty |
\let`=\empty |
\fi |
}% |
% |
% |
\expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else |
\ifflagclear{txiindexbackslashignore}{}{% |
\backslashdisappear |
\backslashdisappear |
\fi |
}% |
% |
\ifflagclear{txiindexhyphenignore}{}{% |
\expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else |
|
\def-{}% |
\def-{}% |
\fi |
}% |
\expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else |
\ifflagclear{txiindexlessthanignore}{}{% |
\def<{}% |
\def<{}% |
\fi |
}% |
\expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else |
\ifflagclear{txiindexatsignignore}{}{% |
\def\@{}% |
\def\@{}% |
\fi |
}% |
} |
} |
|
|
\gdef\indexnonalnumreappear{% |
\gdef\indexnonalnumreappear{% |
Line 5029 $$%
|
Line 5056 $$%
|
% would be for a given command (usually its argument). |
% would be for a given command (usually its argument). |
% |
% |
\def\indexnofonts{% |
\def\indexnofonts{% |
% Accent commands should become @asis. |
\indexnofontstrue |
\def\commondummyaccent##1{\let##1\asis}% |
|
% We can just ignore other control letters. |
|
\def\commondummyletter##1{\let##1\empty}% |
|
% All control words become @asis by default; overrides below. |
|
\let\commondummyword\commondummyaccent |
|
\commondummiesnofonts |
|
% |
|
% Don't no-op \tt, since it isn't a user-level command |
|
% and is used in the definitions of the active chars like <, >, |, etc. |
|
% Likewise with the other plain tex font commands. |
|
%\let\tt=\asis |
|
% |
% |
\def\ { }% |
\def\ { }% |
\def\@{@}% |
\def\@{@}% |
Line 5052 $$%
|
Line 5068 $$%
|
\let\lbracechar\{% |
\let\lbracechar\{% |
\let\rbracechar\}% |
\let\rbracechar\}% |
% |
% |
% Non-English letters. |
|
\def\AA{AA}% |
|
\def\AE{AE}% |
|
\def\DH{DZZ}% |
|
\def\L{L}% |
|
\def\OE{OE}% |
|
\def\O{O}% |
|
\def\TH{TH}% |
|
\def\aa{aa}% |
|
\def\ae{ae}% |
|
\def\dh{dzz}% |
|
\def\exclamdown{!}% |
|
\def\l{l}% |
|
\def\oe{oe}% |
|
\def\ordf{a}% |
|
\def\ordm{o}% |
|
\def\o{o}% |
|
\def\questiondown{?}% |
|
\def\ss{ss}% |
|
\def\th{th}% |
|
% |
|
\let\do\indexnofontsdef |
|
% |
|
\do\LaTeX{LaTeX}% |
|
\do\TeX{TeX}% |
|
% |
|
% Assorted special characters. |
|
\do\atchar{@}% |
|
\do\arrow{->}% |
|
\do\bullet{bullet}% |
|
\do\comma{,}% |
|
\do\copyright{copyright}% |
|
\do\dots{...}% |
|
\do\enddots{...}% |
|
\do\equiv{==}% |
|
\do\error{error}% |
|
\do\euro{euro}% |
|
\do\expansion{==>}% |
|
\do\geq{>=}% |
|
\do\guillemetleft{<<}% |
|
\do\guillemetright{>>}% |
|
\do\guilsinglleft{<}% |
|
\do\guilsinglright{>}% |
|
\do\leq{<=}% |
|
\do\lbracechar{\{}% |
|
\do\minus{-}% |
|
\do\point{.}% |
|
\do\pounds{pounds}% |
|
\do\print{-|}% |
|
\do\quotedblbase{"}% |
|
\do\quotedblleft{"}% |
|
\do\quotedblright{"}% |
|
\do\quoteleft{`}% |
|
\do\quoteright{'}% |
|
\do\quotesinglbase{,}% |
|
\do\rbracechar{\}}% |
|
\do\registeredsymbol{R}% |
|
\do\result{=>}% |
|
\do\textdegree{o}% |
|
% |
% |
% 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 |
|
% writing an index entry, and texindex isn't prepared for an index sort entry |
|
% that starts with \. |
|
% |
% |
% Since macro invocations are followed by braces, we can just redefine them |
% Since macro invocations are followed by braces, we can just redefine them |
% to take a single TeX argument. The case of a macro invocation that |
% to take a single TeX argument. The case of a macro invocation that |
% goes to end-of-line is not handled. |
% goes to end-of-line is not handled. |
% |
% |
|
\def\commondummyword##1{\let##1\asis}% |
\macrolist |
\macrolist |
\let\value\indexnofontsvalue |
\let\value\indexnofontsvalue |
} |
} |
|
|
% Give the control sequence a definition that removes the {} that follows |
|
% its use, e.g. @AA{} -> AA |
|
\def\indexnofontsdef#1#2{\def#1##1{#2}}% |
|
|
|
|
|
|
|
|
|
Line 5260 $$%
|
Line 5211 $$%
|
\xdef\trimmed{\segment}% |
\xdef\trimmed{\segment}% |
\xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% |
\xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% |
\xdef\indexsortkey{\trimmed}% |
\xdef\indexsortkey{\trimmed}% |
\ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi |
\ifx\indexsortkey\empty |
|
\message{Empty index sort key near line \the\inputlineno}% |
|
\xdef\indexsortkey{ }% |
|
\fi |
}\fi |
}\fi |
% |
% |
% Append to \fullindexsortkey. |
% Append to \fullindexsortkey. |
Line 5284 $$%
|
Line 5238 $$%
|
% the current value of \escapechar. |
% the current value of \escapechar. |
\def\escapeisbackslash{\escapechar=`\\} |
\def\escapeisbackslash{\escapechar=`\\} |
|
|
% Use \ in index files by default. texi2dvi didn't support @ as the escape |
% Uncomment to use \ in index files by default. Old texi2dvi (before 2019) |
% character (as it checked for "\entry" in the files, and not "@entry"). When |
% didn't support @ as the escape character (as it checked for "\entry" in |
% the new version of texi2dvi has had a chance to become more prevalent, then |
% the files, and not "@entry"). |
% the escape character can change back to @ again. This should be an easy |
% In the future we can remove this flag and simplify the code for |
% change to make now because both @ and \ are only used as escape characters in |
% index files and backslashes, once the support is no longer likely to be |
% index files, never standing for themselves. |
% useful. |
% |
% |
\set txiindexescapeisbackslash |
% \set txiindexescapeisbackslash |
|
|
% Write the entry in \indextext to the index file. |
% Write the entry in \indextext to the index file. |
% |
% |
Line 5305 $$%
|
Line 5259 $$%
|
% |
% |
\atdummies |
\atdummies |
% |
% |
\expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else |
\ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}% |
\escapeisbackslash |
|
\fi |
|
% |
% |
% For texindex which always views { and } as separators. |
% For texindex which always views { and } as separators. |
\def\{{\lbracechar{}}% |
\def\{{\lbracechar{}}% |
Line 5491 $$%
|
Line 5443 $$%
|
% old index files using \ as the escape character. Reading this would |
% old index files using \ as the escape character. Reading this would |
% at best lead to typesetting garbage, at worst a TeX syntax error. |
% at best lead to typesetting garbage, at worst a TeX syntax error. |
\def\printindexzz#1#2\finish{% |
\def\printindexzz#1#2\finish{% |
\expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax |
\ifflagclear{txiindexescapeisbackslash}{% |
\uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 |
\uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 |
\expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax |
\ifflagclear{txiskipindexfileswithbackslash}{% |
\errmessage{% |
\errmessage{% |
ERROR: A sorted index file in an obsolete format was skipped. |
ERROR: A sorted index file in an obsolete format was skipped. |
To fix this problem, please upgrade your version of 'texi2dvi' |
To fix this problem, please upgrade your version of 'texi2dvi' |
Line 5509 this, Texinfo will try to use index file
|
Line 5461 this, Texinfo will try to use index file
|
If you continue to have problems, deleting the index files and starting again |
If you continue to have problems, deleting the index files and starting again |
might help (with 'rm \jobname.?? \jobname.??s')% |
might help (with 'rm \jobname.?? \jobname.??s')% |
}% |
}% |
\else |
}{% |
(Skipped sorted index file in obsolete format) |
(Skipped sorted index file in obsolete format) |
\fi |
}% |
\else |
\else |
\begindoublecolumns |
\begindoublecolumns |
\input \jobname.\indexname s |
\input \jobname.\indexname s |
\enddoublecolumns |
\enddoublecolumns |
\fi |
\fi |
\else |
}{% |
\begindoublecolumns |
\begindoublecolumns |
\catcode`\\=0\relax |
\catcode`\\=0\relax |
% |
% |
Line 5527 might help (with 'rm \jobname.?? \jobnam
|
Line 5479 might help (with 'rm \jobname.?? \jobnam
|
\catcode`\@=0\relax |
\catcode`\@=0\relax |
\input \jobname.\indexname s |
\input \jobname.\indexname s |
\enddoublecolumns |
\enddoublecolumns |
\fi |
}% |
} |
} |
|
|
% These macros are used by the sorted index file itself. |
% These macros are used by the sorted index file itself. |
Line 5602 might help (with 'rm \jobname.?? \jobnam
|
Line 5554 might help (with 'rm \jobname.?? \jobnam
|
\newdimen\entryrightmargin |
\newdimen\entryrightmargin |
\entryrightmargin=0pt |
\entryrightmargin=0pt |
|
|
|
% amount to indent subsequent lines in an entry when it spans more than |
|
% one line. |
|
\newdimen\entrycontskip |
|
\entrycontskip=1em |
|
|
|
% for PDF output, whether to make the text of the entry a link to the page |
|
% number. set for @contents and @shortcontents where there is only one |
|
% page number. |
|
\newif\iflinkentrytext |
|
|
% \entry typesets a paragraph consisting of the text (#1), dot leaders, and |
% \entry typesets a paragraph consisting of the text (#1), dot leaders, and |
% then page number (#2) flushed to the right margin. It is used for index |
% then page number (#2) flushed to the right margin. It is used for index |
% and table of contents entries. The paragraph is indented by \leftskip. |
% and table of contents entries. The paragraph is indented by \leftskip. |
Line 5628 might help (with 'rm \jobname.?? \jobnam
|
Line 5590 might help (with 'rm \jobname.?? \jobnam
|
} |
} |
\def\entrybreak{\unskip\space\ignorespaces}% |
\def\entrybreak{\unskip\space\ignorespaces}% |
\def\doentry{% |
\def\doentry{% |
% Save the text of the entry |
% Save the text of the entry in \boxA |
\global\setbox\boxA=\hbox\bgroup |
\global\setbox\boxA=\hbox\bgroup |
\bgroup % Instead of the swallowed brace. |
\bgroup % Instead of the swallowed brace. |
\noindent |
\noindent |
Line 5638 might help (with 'rm \jobname.?? \jobnam
|
Line 5600 might help (with 'rm \jobname.?? \jobnam
|
% with catcodes occurring. |
% with catcodes occurring. |
} |
} |
{\catcode`\@=11 |
{\catcode`\@=11 |
|
% #1 is the page number |
\gdef\finishentry#1{% |
\gdef\finishentry#1{% |
\egroup % end box A |
\egroup % end \boxA |
\dimen@ = \wd\boxA % Length of text of entry |
\dimen@ = \wd\boxA % Length of text of entry |
|
% add any leaders and page number to \boxA. |
\global\setbox\boxA=\hbox\bgroup |
\global\setbox\boxA=\hbox\bgroup |
\unhbox\boxA |
\ifpdforxetex |
% #1 is the page number. |
\iflinkentrytext |
|
\pdflinkpage{#1}{\unhbox\boxA}% |
|
\else |
|
\unhbox\boxA |
|
\fi |
|
\else |
|
\unhbox\boxA |
|
\fi |
% |
% |
% Get the width of the page numbers, and only use |
% Get the width of the page numbers, and only use |
% leaders if they are present. |
% leaders if they are present. |
Line 5662 might help (with 'rm \jobname.?? \jobnam
|
Line 5633 might help (with 'rm \jobname.?? \jobnam
|
\fi |
\fi |
\fi |
\fi |
\egroup % end \boxA |
\egroup % end \boxA |
|
% |
|
% now output |
\ifdim\wd\boxB = 0pt |
\ifdim\wd\boxB = 0pt |
\noindent\unhbox\boxA\par |
\noindent\unhbox\boxA\par |
\nobreak |
\nobreak |
Line 5679 might help (with 'rm \jobname.?? \jobnam
|
Line 5652 might help (with 'rm \jobname.?? \jobnam
|
\parfillskip=0pt plus -1fill |
\parfillskip=0pt plus -1fill |
% |
% |
\advance\rightskip by \entryrightmargin |
\advance\rightskip by \entryrightmargin |
% Determine how far we can stretch into the margin. |
|
% This allows, e.g., "Appendix H GNU Free Documentation License" to |
|
% fit on one line in @letterpaper format. |
|
\ifdim\entryrightmargin>2.1em |
|
\dimen@i=2.1em |
|
\else |
|
\dimen@i=0em |
|
\fi |
|
\advance \parfillskip by 0pt minus 1\dimen@i |
|
% |
% |
\dimen@ii = \hsize |
\dimen@ii = \hsize |
\advance\dimen@ii by -1\leftskip |
\advance\dimen@ii by -1\leftskip |
\advance\dimen@ii by -1\entryrightmargin |
\advance\dimen@ii by -1\entryrightmargin |
\advance\dimen@ii by 1\dimen@i |
|
\ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line |
\ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line |
\ifdim\dimen@ > 0.8\dimen@ii % due to long index text |
\ifdim\dimen@ > 0.8\dimen@ii % due to long index text |
% Try to split the text roughly evenly. \dimen@ will be the length of |
|
% the first line. |
|
\dimen@ = 0.7\dimen@ |
|
\dimen@ii = \hsize |
|
\ifnum\dimen@>\dimen@ii |
|
% If the entry is too long (for example, if it needs more than |
|
% two lines), use all the space in the first line. |
|
\dimen@ = \dimen@ii |
|
\fi |
|
\advance\leftskip by 0pt plus 1fill % ragged right |
\advance\leftskip by 0pt plus 1fill % ragged right |
\advance \dimen@ by 1\rightskip |
|
\parshape = 2 0pt \dimen@ 0em \dimen@ii |
|
% Ideally we'd add a finite glue at the end of the first line only, |
|
% instead of using \parshape with explicit line lengths, but TeX |
|
% doesn't seem to provide a way to do such a thing. |
|
% |
% |
% Indent all lines but the first one. |
% Indent all lines but the first one. |
\advance\leftskip by 1em |
\advance\leftskip by \entrycontskip |
\advance\parindent by -1em |
\advance\parindent by -\entrycontskip |
\fi\fi |
\fi\fi |
\indent % start paragraph |
\indent % start paragraph |
\unhbox\boxA |
\unhbox\boxA |
Line 5736 might help (with 'rm \jobname.?? \jobnam
|
Line 5685 might help (with 'rm \jobname.?? \jobnam
|
\newskip\thinshrinkable |
\newskip\thinshrinkable |
\skip\thinshrinkable=.15em minus .15em |
\skip\thinshrinkable=.15em minus .15em |
|
|
% Like plain.tex's \dotfill, except uses up at least 1 em. |
% Like plain.tex's \dotfill, except uses up at least 0.5 em. |
% The filll stretch here overpowers both the fil and fill stretch to push |
% The filll stretch here overpowers both the fil and fill stretch to push |
% the page number to the right. |
% the page number to the right. |
\def\indexdotfill{\cleaders |
\def\indexdotfill{\cleaders |
\hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} |
\hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll} |
|
|
|
|
\def\primary #1{\line{#1\hfil}} |
\def\primary #1{\line{#1\hfil}} |
|
|
Line 5794 might help (with 'rm \jobname.?? \jobnam
|
Line 5742 might help (with 'rm \jobname.?? \jobnam
|
% below is chosen so that the gutter has the same value (well, +-<1pt) |
% below is chosen so that the gutter has the same value (well, +-<1pt) |
% as it did when we hard-coded it. |
% as it did when we hard-coded it. |
% |
% |
% We put the result in a separate register, \doublecolumhsize, so we |
% We put the result in a separate register, \doublecolumnhsize, so we |
% can restore it in \pagesofar, after \hsize itself has (potentially) |
% can restore it in \pagesofar, after \hsize itself has (potentially) |
% been clobbered. |
% been clobbered. |
% |
% |
Line 5963 might help (with 'rm \jobname.?? \jobnam
|
Line 5911 might help (with 'rm \jobname.?? \jobnam
|
% Chapters, sections, etc. |
% Chapters, sections, etc. |
|
|
% Let's start with @part. |
% Let's start with @part. |
\outer\parseargdef\part{\partzzz{#1}} |
\parseargdef\part{\partzzz{#1}} |
\def\partzzz#1{% |
\def\partzzz#1{% |
\chapoddpage |
\chapoddpage |
\null |
\null |
Line 6189 might help (with 'rm \jobname.?? \jobnam
|
Line 6137 might help (with 'rm \jobname.?? \jobnam
|
% normally unnmhead0 calls unnumberedzzz: |
% normally unnmhead0 calls unnumberedzzz: |
\outer\parseargdef\unnumbered{\unnmhead0{#1}} |
\outer\parseargdef\unnumbered{\unnmhead0{#1}} |
\def\unnumberedzzz#1{% |
\def\unnumberedzzz#1{% |
\global\secno=0 \global\subsecno=0 \global\subsubsecno=0 |
\global\advance\unnumberedno by 1 |
\global\advance\unnumberedno by 1 |
|
% |
% |
% Since an unnumbered has no number, no prefix for figures. |
% Since an unnumbered has no number, no prefix for figures. |
\global\let\chaplevelprefix = \empty |
\global\let\chaplevelprefix = \empty |
Line 6246 might help (with 'rm \jobname.?? \jobnam
|
Line 6193 might help (with 'rm \jobname.?? \jobnam
|
% normally calls unnumberedseczzz: |
% normally calls unnumberedseczzz: |
\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} |
\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} |
\def\unnumberedseczzz#1{% |
\def\unnumberedseczzz#1{% |
\global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 |
\global\advance\unnumberedno by 1 |
\sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% |
\sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}% |
} |
} |
|
|
% Subsections. |
% Subsections. |
Line 6270 might help (with 'rm \jobname.?? \jobnam
|
Line 6217 might help (with 'rm \jobname.?? \jobnam
|
% normally calls unnumberedsubseczzz: |
% normally calls unnumberedsubseczzz: |
\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} |
\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} |
\def\unnumberedsubseczzz#1{% |
\def\unnumberedsubseczzz#1{% |
\global\subsubsecno=0 \global\advance\subsecno by 1 |
\global\advance\unnumberedno by 1 |
\sectionheading{#1}{subsec}{Ynothing}% |
\sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}% |
{\the\unnumberedno.\the\secno.\the\subsecno}% |
|
} |
} |
|
|
% Subsubsections. |
% Subsubsections. |
Line 6296 might help (with 'rm \jobname.?? \jobnam
|
Line 6242 might help (with 'rm \jobname.?? \jobnam
|
% normally unnumberedsubsubseczzz: |
% normally unnumberedsubsubseczzz: |
\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} |
\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} |
\def\unnumberedsubsubseczzz#1{% |
\def\unnumberedsubsubseczzz#1{% |
\global\advance\subsubsecno by 1 |
\global\advance\unnumberedno by 1 |
\sectionheading{#1}{subsubsec}{Ynothing}% |
\sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}% |
{\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% |
|
} |
} |
|
|
% These macros control what the section commands do, according |
% These macros control what the section commands do, according |
Line 6361 might help (with 'rm \jobname.?? \jobnam
|
Line 6306 might help (with 'rm \jobname.?? \jobnam
|
\fi |
\fi |
} |
} |
|
|
\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname} |
\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon} |
|
|
\def\CHAPPAGoff{% |
\def\CHAPPAGoff{% |
\global\let\contentsalignmacro = \chappager |
\global\let\contentsalignmacro = \chappager |
Line 6378 might help (with 'rm \jobname.?? \jobnam
|
Line 6323 might help (with 'rm \jobname.?? \jobnam
|
\global\let\pchapsepmacro=\chapoddpage |
\global\let\pchapsepmacro=\chapoddpage |
\global\def\HEADINGSon{\HEADINGSdouble}} |
\global\def\HEADINGSon{\HEADINGSdouble}} |
|
|
\CHAPPAGon |
\setchapternewpage on |
|
|
% \chapmacro - Chapter opening. |
% \chapmacro - Chapter opening. |
% |
% |
Line 6391 might help (with 'rm \jobname.?? \jobnam
|
Line 6336 might help (with 'rm \jobname.?? \jobnam
|
\def\Yappendixkeyword{Yappendix} |
\def\Yappendixkeyword{Yappendix} |
\def\Yomitfromtockeyword{Yomitfromtoc} |
\def\Yomitfromtockeyword{Yomitfromtoc} |
% |
% |
|
% |
|
% Definitions for @thischapter. These can be overridden in translation |
|
% files. |
|
\def\thischapterAppendix{% |
|
\putwordAppendix{} \thischapternum: \thischaptername} |
|
|
|
\def\thischapterChapter{% |
|
\putwordChapter{} \thischapternum: \thischaptername} |
|
% |
|
% |
\def\chapmacro#1#2#3{% |
\def\chapmacro#1#2#3{% |
\expandafter\ifx\thisenv\titlepage\else |
\expandafter\ifx\thisenv\titlepage\else |
\checkenv{}% chapters, etc., should not start inside an environment. |
\checkenv{}% chapters, etc., should not start inside an environment. |
Line 6413 might help (with 'rm \jobname.?? \jobnam
|
Line 6368 might help (with 'rm \jobname.?? \jobnam
|
\xdef\currentchapterdefs{% |
\xdef\currentchapterdefs{% |
\gdef\noexpand\thischaptername{\the\toks0}% |
\gdef\noexpand\thischaptername{\the\toks0}% |
\gdef\noexpand\thischapternum{\appendixletter}% |
\gdef\noexpand\thischapternum{\appendixletter}% |
% \noexpand\putwordAppendix avoids expanding indigestible |
\let\noexpand\thischapter\noexpand\thischapterAppendix |
% commands in some of the translations. |
|
\gdef\noexpand\thischapter{\noexpand\putwordAppendix{} |
|
\noexpand\thischapternum: |
|
\noexpand\thischaptername}% |
|
}% |
}% |
\else |
\else |
\toks0={#1}% |
\toks0={#1}% |
\xdef\currentchapterdefs{% |
\xdef\currentchapterdefs{% |
\gdef\noexpand\thischaptername{\the\toks0}% |
\gdef\noexpand\thischaptername{\the\toks0}% |
\gdef\noexpand\thischapternum{\the\chapno}% |
\gdef\noexpand\thischapternum{\the\chapno}% |
% \noexpand\putwordChapter avoids expanding indigestible |
\let\noexpand\thischapter\noexpand\thischapterChapter |
% commands in some of the translations. |
|
\gdef\noexpand\thischapter{\noexpand\putwordChapter{} |
|
\noexpand\thischapternum: |
|
\noexpand\thischaptername}% |
|
}% |
}% |
\fi\fi\fi |
\fi\fi\fi |
% |
% |
Line 6514 might help (with 'rm \jobname.?? \jobnam
|
Line 6461 might help (with 'rm \jobname.?? \jobnam
|
\def\subsubsecheadingskip{\subsecheadingskip} |
\def\subsubsecheadingskip{\subsecheadingskip} |
\def\subsubsecheadingbreak{\subsecheadingbreak} |
\def\subsubsecheadingbreak{\subsecheadingbreak} |
|
|
|
% Definition for @thissection. This can be overridden in translation |
|
% files. |
|
\def\thissectionDef{% |
|
\putwordSection{} \thissectionnum: \thissectionname} |
|
% |
|
|
|
|
% Print any size, any type, section title. |
% Print any size, any type, section title. |
% |
% |
Line 6555 might help (with 'rm \jobname.?? \jobnam
|
Line 6508 might help (with 'rm \jobname.?? \jobnam
|
\xdef\currentsectiondefs{% |
\xdef\currentsectiondefs{% |
\gdef\noexpand\thissectionname{\the\toks0}% |
\gdef\noexpand\thissectionname{\the\toks0}% |
\gdef\noexpand\thissectionnum{#4}% |
\gdef\noexpand\thissectionnum{#4}% |
% \noexpand\putwordSection avoids expanding indigestible |
\let\noexpand\thissection\noexpand\thissectionDef |
% commands in some of the translations. |
|
\gdef\noexpand\thissection{\noexpand\putwordSection{} |
|
\noexpand\thissectionnum: |
|
\noexpand\thissectionname}% |
|
}% |
}% |
\fi |
\fi |
\else |
\else |
Line 6568 might help (with 'rm \jobname.?? \jobnam
|
Line 6517 might help (with 'rm \jobname.?? \jobnam
|
\xdef\currentsectiondefs{% |
\xdef\currentsectiondefs{% |
\gdef\noexpand\thissectionname{\the\toks0}% |
\gdef\noexpand\thissectionname{\the\toks0}% |
\gdef\noexpand\thissectionnum{#4}% |
\gdef\noexpand\thissectionnum{#4}% |
% \noexpand\putwordSection avoids expanding indigestible |
\let\noexpand\thissection\noexpand\thissectionDef |
% commands in some of the translations. |
|
\gdef\noexpand\thissection{\noexpand\putwordSection{} |
|
\noexpand\thissectionnum: |
|
\noexpand\thissectionname}% |
|
}% |
}% |
\fi |
\fi |
\fi\fi\fi |
\fi\fi\fi |
Line 6732 might help (with 'rm \jobname.?? \jobnam
|
Line 6677 might help (with 'rm \jobname.?? \jobnam
|
\input \tocreadfilename |
\input \tocreadfilename |
} |
} |
|
|
|
% process toc file to find the maximum width of the section numbers for |
|
% each chapter |
|
\def\findsecnowidths{% |
|
\begingroup |
|
\setupdatafile |
|
\activecatcodes |
|
\secentryfonts |
|
% Redefinitions |
|
\def\numchapentry##1##2##3##4{% |
|
\def\curchapname{secnowidth-##2}% |
|
\curchapmax=0pt |
|
}% |
|
\let\appentry\numchapentry |
|
% |
|
\def\numsecentry##1##2##3##4{% |
|
\def\cursecname{secnowidth-##2}% |
|
\cursecmax=0pt |
|
% |
|
\setbox0=\hbox{##2}% |
|
\ifdim\wd0>\curchapmax |
|
\curchapmax=\wd0 |
|
\expandafter\xdef\csname\curchapname\endcsname{\the\wd0}% |
|
\fi |
|
}% |
|
\let\appsecentry\numsecentry |
|
% |
|
\def\numsubsecentry##1##2##3##4{% |
|
\def\curssecname{secnowidth-##2}% |
|
\curssecmax=0pt |
|
% |
|
\setbox0=\hbox{##2}% |
|
\ifdim\wd0>\cursecmax |
|
\cursecmax=\wd0 |
|
\expandafter\xdef\csname\cursecname\endcsname{\the\wd0}% |
|
\fi |
|
}% |
|
\let\appsubsecentry\numsubsecentry |
|
% |
|
\def\numsubsubsecentry##1##2##3##4{% |
|
\setbox0=\hbox{##2}% |
|
\ifdim\wd0>\curssecmax |
|
\curssecmax=\wd0 |
|
\expandafter\xdef\csname\curssecname\endcsname{\the\wd0}% |
|
\fi |
|
}% |
|
\let\appsubsubsecentry\numsubsubsecentry |
|
% |
|
% Discard any output by outputting to dummy vbox, in case the toc file |
|
% contains macros that we have not redefined above. |
|
\setbox\dummybox\vbox\bgroup |
|
\input \tocreadfilename\relax |
|
\egroup |
|
\endgroup |
|
} |
|
\newdimen\curchapmax |
|
\newdimen\cursecmax |
|
\newdimen\curssecmax |
|
|
|
|
|
% set #1 to the maximum section width for #2 |
|
\def\retrievesecnowidth#1#2{% |
|
\expandafter\let\expandafter\savedsecnowidth \csname secnowidth-#2\endcsname |
|
\ifx\savedsecnowidth\relax |
|
#1=0pt |
|
\else |
|
#1=\savedsecnowidth |
|
\fi |
|
} |
|
\newdimen\secnowidthchap |
|
\secnowidthchap=0pt |
|
\newdimen\secnowidthsec |
|
\secnowidthsec=0pt |
|
\newdimen\secnowidthssec |
|
\secnowidthssec=0pt |
|
|
|
|
\newskip\contentsrightmargin \contentsrightmargin=1in |
\newskip\contentsrightmargin \contentsrightmargin=1in |
\newcount\savepageno |
\newcount\savepageno |
\newcount\lastnegativepageno \lastnegativepageno = -1 |
\newcount\lastnegativepageno \lastnegativepageno = -1 |
Line 6758 might help (with 'rm \jobname.?? \jobnam
|
Line 6779 might help (with 'rm \jobname.?? \jobnam
|
\def\thistitle{}% no title in double-sided headings |
\def\thistitle{}% no title in double-sided headings |
% Record where the Roman numerals started. |
% Record where the Roman numerals started. |
\ifnum\romancount=0 \global\romancount=\pagecount \fi |
\ifnum\romancount=0 \global\romancount=\pagecount \fi |
|
\linkentrytexttrue |
} |
} |
|
|
|
% \raggedbottom in plain.tex hardcodes \topskip so override it |
|
\catcode`\@=11 |
|
\def\raggedbottom{\advance\topskip by 0pt plus60pt \r@ggedbottomtrue} |
|
\catcode`\@=\other |
|
|
% redefined for the two-volume lispref. We always output on |
% redefined for the two-volume lispref. We always output on |
% \jobname.toc even if this is redefined. |
% \jobname.toc even if this is redefined. |
% |
% |
Line 6771 might help (with 'rm \jobname.?? \jobnam
|
Line 6798 might help (with 'rm \jobname.?? \jobnam
|
\startcontents{\putwordTOC}% |
\startcontents{\putwordTOC}% |
\openin 1 \tocreadfilename\space |
\openin 1 \tocreadfilename\space |
\ifeof 1 \else |
\ifeof 1 \else |
|
\findsecnowidths |
\readtocfile |
\readtocfile |
\fi |
\fi |
\vfill \eject |
\vfill \eject |
Line 6798 might help (with 'rm \jobname.?? \jobnam
|
Line 6826 might help (with 'rm \jobname.?? \jobnam
|
\rm |
\rm |
\hyphenpenalty = 10000 |
\hyphenpenalty = 10000 |
\advance\baselineskip by 1pt % Open it up a little. |
\advance\baselineskip by 1pt % Open it up a little. |
|
\extrasecnoskip=0.4pt |
\def\numsecentry##1##2##3##4{} |
\def\numsecentry##1##2##3##4{} |
\let\appsecentry = \numsecentry |
\let\appsecentry = \numsecentry |
\let\unnsecentry = \numsecentry |
\let\unnsecentry = \numsecentry |
Line 6822 might help (with 'rm \jobname.?? \jobnam
|
Line 6851 might help (with 'rm \jobname.?? \jobnam
|
% Get ready to use Arabic numerals again |
% Get ready to use Arabic numerals again |
\def\contentsendroman{% |
\def\contentsendroman{% |
\lastnegativepageno = \pageno |
\lastnegativepageno = \pageno |
\global\pageno = \savepageno |
\global\pageno=1 |
% |
\contentsendcount = \pagecount |
% If \romancount > \arabiccount, the contents are at the end of the |
|
% document. Otherwise, advance where the Arabic numerals start for |
|
% the page numbers. |
|
\ifnum\romancount>\arabiccount\else\global\arabiccount=\pagecount\fi |
|
} |
} |
|
|
% Typeset the label for a chapter or appendix for the short contents. |
% Typeset the label for a chapter or appendix for the short contents. |
Line 6837 might help (with 'rm \jobname.?? \jobnam
|
Line 6862 might help (with 'rm \jobname.?? \jobnam
|
% This space should be enough, since a single number is .5em, and the |
% This space should be enough, since a single number is .5em, and the |
% widest letter (M) is 1em, at least in the Computer Modern fonts. |
% widest letter (M) is 1em, at least in the Computer Modern fonts. |
% But use \hss just in case. |
% But use \hss just in case. |
% (This space doesn't include the extra space that gets added after |
|
% the label; that gets put in by \shortchapentry above.) |
|
% |
% |
% We'd like to right-justify chapter numbers, but that looks strange |
% We'd like to right-justify chapter numbers, but that looks strange |
% with appendix letters. And right-justifying numbers and |
% with appendix letters. And right-justifying numbers and |
Line 6848 might help (with 'rm \jobname.?? \jobnam
|
Line 6871 might help (with 'rm \jobname.?? \jobnam
|
\hbox to 1em{#1\hss}% |
\hbox to 1em{#1\hss}% |
} |
} |
|
|
% These macros generate individual entries in the table of contents. |
% These macros generate individual entries in the table of contents, |
% The first argument is the chapter or section name. |
% and are read in from the *.toc file. |
% The last argument is the page number. |
% |
% The arguments in between are the chapter number, section number, ... |
% The arguments are like: |
|
% \def\numchapentry#1#2#3#4 |
|
% #1 - the chapter or section name. |
|
% #2 - section number |
|
% #3 - level of section (e.g "chap", "sec") |
|
% #4 - page number |
|
|
% Parts, in the main contents. Replace the part number, which doesn't |
% 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. |
% exist, with an empty box. Let's hope all the numbers have the same width. |
Line 6864 might help (with 'rm \jobname.?? \jobnam
|
Line 6892 might help (with 'rm \jobname.?? \jobnam
|
\vskip 0pt plus 5\baselineskip |
\vskip 0pt plus 5\baselineskip |
\penalty-300 |
\penalty-300 |
\vskip 0pt plus -5\baselineskip |
\vskip 0pt plus -5\baselineskip |
\dochapentry{\numeralbox\labelspace#1}{}% |
\dochapentry{#1}{\numeralbox}{}% |
} |
} |
% |
% |
% Parts, in the short toc. |
% Parts, in the short toc. |
Line 6875 might help (with 'rm \jobname.?? \jobnam
|
Line 6903 might help (with 'rm \jobname.?? \jobnam
|
} |
} |
|
|
% 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{% |
|
\retrievesecnowidth\secnowidthchap{#2}% |
|
\dochapentry{#1}{#2}{#4}% |
|
} |
|
|
% Chapters, in the short toc. |
% Chapters, in the short toc. |
% See comments in \dochapentry re vbox and related settings. |
|
\def\shortchapentry#1#2#3#4{% |
\def\shortchapentry#1#2#3#4{% |
\tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% |
\tocentry{#1}{\shortchaplabel{#2}}{#4}% |
} |
} |
|
|
% Appendices, in the main contents. |
% Appendices, in the main contents. |
Line 6891 might help (with 'rm \jobname.?? \jobnam
|
Line 6921 might help (with 'rm \jobname.?? \jobnam
|
\setbox0 = \hbox{\putwordAppendix{} M}% |
\setbox0 = \hbox{\putwordAppendix{} M}% |
\hbox to \wd0{\putwordAppendix{} #1\hss}} |
\hbox to \wd0{\putwordAppendix{} #1\hss}} |
% |
% |
\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}} |
\def\appentry#1#2#3#4{% |
|
\retrievesecnowidth\secnowidthchap{#2}% |
|
\dochapentry{\appendixbox{#2}\hskip.7em#1}{}{#4}% |
|
} |
|
|
% Unnumbered chapters. |
% Unnumbered chapters. |
\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} |
\def\unnchapentry#1#2#3#4{\dochapentry{#1}{}{#4}} |
\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} |
\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}} |
|
|
% Sections. |
% Sections. |
\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} |
\def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#4}} |
|
|
|
\def\numsecentry#1#2#3#4{% |
|
\retrievesecnowidth\secnowidthsec{#2}% |
|
\dosecentry{#1}{#2}{#4}% |
|
} |
\let\appsecentry=\numsecentry |
\let\appsecentry=\numsecentry |
\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} |
\def\unnsecentry#1#2#3#4{% |
|
\retrievesecnowidth\secnowidthsec{#2}% |
|
\dosecentry{#1}{}{#4}% |
|
} |
|
|
% Subsections. |
% Subsections. |
\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} |
\def\numsubsecentry#1#2#3#4{% |
|
\retrievesecnowidth\secnowidthssec{#2}% |
|
\dosubsecentry{#1}{#2}{#4}% |
|
} |
\let\appsubsecentry=\numsubsecentry |
\let\appsubsecentry=\numsubsecentry |
\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} |
\def\unnsubsecentry#1#2#3#4{% |
|
\retrievesecnowidth\secnowidthssec{#2}% |
|
\dosubsecentry{#1}{}{#4}% |
|
} |
|
|
% And subsubsections. |
% And subsubsections. |
\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} |
\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#4}} |
\let\appsubsubsecentry=\numsubsubsecentry |
\let\appsubsubsecentry=\numsubsubsecentry |
\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} |
\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{}{#4}} |
|
|
% This parameter controls the indentation of the various levels. |
% This parameter controls the indentation of the various levels. |
% Same as \defaultparindent. |
% Same as \defaultparindent. |
\newdimen\tocindent \tocindent = 15pt |
\newdimen\tocindent \tocindent = 15pt |
|
|
% Now for the actual typesetting. In all these, #1 is the text and #2 is the |
% Now for the actual typesetting. In all these, #1 is the text, #2 is |
% page number. |
% a section number if present, and #3 is the page number. |
% |
% |
% If the toc has to be broken over pages, we want it to be at chapters |
% If the toc has to be broken over pages, we want it to be at chapters |
% if at all possible; hence the \penalty. |
% if at all possible; hence the \penalty. |
\def\dochapentry#1#2{% |
\def\dochapentry#1#2#3{% |
\penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip |
\penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip |
\begingroup |
\begingroup |
% Move the page numbers slightly to the right |
% Move the page numbers slightly to the right |
\advance\entryrightmargin by -0.05em |
\advance\entryrightmargin by -0.05em |
\chapentryfonts |
\chapentryfonts |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\extrasecnoskip=0.4em % separate chapter number more |
|
\tocentry{#1}{#2}{#3}% |
\endgroup |
\endgroup |
\nobreak\vskip .25\baselineskip plus.1\baselineskip |
\nobreak\vskip .25\baselineskip plus.1\baselineskip |
} |
} |
|
|
\def\dosecentry#1#2{\begingroup |
\def\dosecentry#1#2#3{\begingroup |
|
\secnowidth=\secnowidthchap |
\secentryfonts \leftskip=\tocindent |
\secentryfonts \leftskip=\tocindent |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\tocentry{#1}{#2}{#3}% |
\endgroup} |
\endgroup} |
|
|
\def\dosubsecentry#1#2{\begingroup |
\def\dosubsecentry#1#2#3{\begingroup |
|
\secnowidth=\secnowidthsec |
\subsecentryfonts \leftskip=2\tocindent |
\subsecentryfonts \leftskip=2\tocindent |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\tocentry{#1}{#2}{#3}% |
\endgroup} |
\endgroup} |
|
|
\def\dosubsubsecentry#1#2{\begingroup |
\def\dosubsubsecentry#1#2#3{\begingroup |
|
\secnowidth=\secnowidthssec |
\subsubsecentryfonts \leftskip=3\tocindent |
\subsubsecentryfonts \leftskip=3\tocindent |
\tocentry{#1}{\dopageno\bgroup#2\egroup}% |
\tocentry{#1}{#2}{#3}% |
\endgroup} |
\endgroup} |
|
|
% We use the same \entry macro as for the index entries. |
% Used for the maximum width of a section number so we can align |
\let\tocentry = \entry |
% section titles. |
|
\newdimen\secnowidth |
% Space between chapter (or whatever) number and the title. |
\secnowidth=0pt |
\def\labelspace{\hskip1em \relax} |
\newdimen\extrasecnoskip |
|
\extrasecnoskip=0pt |
\def\dopageno#1{{\rm #1}} |
|
\def\doshortpageno#1{{\rm #1}} |
% \tocentry{TITLE}{SEC NO}{PAGE} |
|
% |
|
\def\tocentry#1#2#3{% |
|
\def\secno{#2}% |
|
\ifx\empty\secno |
|
\entry{#1}{#3}% |
|
\else |
|
\ifdim 0pt=\secnowidth |
|
\setbox0=\hbox{#2\hskip\labelspace\hskip\extrasecnoskip}% |
|
\else |
|
\advance\secnowidth by \labelspace |
|
\advance\secnowidth by \extrasecnoskip |
|
\setbox0=\hbox to \secnowidth{% |
|
#2\hskip\labelspace\hskip\extrasecnoskip\hfill}% |
|
\fi |
|
\entrycontskip=\wd0 |
|
\entry{\box0 #1}{#3}% |
|
\fi |
|
} |
|
\newdimen\labelspace |
|
\labelspace=0.6em |
|
|
\def\chapentryfonts{\secfonts \rm} |
\def\chapentryfonts{\secfonts \rm} |
\def\secentryfonts{\textfonts} |
\def\secentryfonts{\textfonts} |
Line 7100 might help (with 'rm \jobname.?? \jobnam
|
Line 7171 might help (with 'rm \jobname.?? \jobnam
|
\newdimen\cartouter\newdimen\cartinner |
\newdimen\cartouter\newdimen\cartinner |
\newskip\normbskip\newskip\normpskip\newskip\normlskip |
\newskip\normbskip\newskip\normpskip\newskip\normlskip |
|
|
|
\envparseargdef\cartouche{% |
\envdef\cartouche{% |
|
\cartouchefontdefs |
\cartouchefontdefs |
\ifhmode\par\fi % can't be in the midst of a paragraph. |
\ifhmode\par\fi % can't be in the midst of a paragraph. |
\startsavinginserts |
\startsavinginserts |
\lskip=\leftskip \rskip=\rightskip |
\lskip=\leftskip \rskip=\rightskip |
\leftskip=0pt\rightskip=0pt % we want these *outside*. |
\leftskip=0pt\rightskip=0pt % we want these *outside*. |
|
% |
|
% Set paragraph width for text inside cartouche. There are |
|
% left and right margins of 3pt each plus two vrules 0.4pt each. |
\cartinner=\hsize \advance\cartinner by-\lskip |
\cartinner=\hsize \advance\cartinner by-\lskip |
\advance\cartinner by-\rskip |
\advance\cartinner by-\rskip |
|
\advance\cartinner by -6.8pt |
|
% |
|
% For drawing top and bottom of cartouche. Each corner char |
|
% adds 6pt and we take off the width of a rule to line up with the |
|
% right boundary perfectly. |
\cartouter=\hsize |
\cartouter=\hsize |
\advance\cartouter by 18.4pt % allow for 3pt kerns on either |
\advance\cartouter by 11.6pt |
% side, and for 6pt waste from |
% |
% each corner char, and rule thickness |
|
\normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip |
\normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip |
% |
% |
% If this cartouche directly follows a sectioning command, we need the |
% If this cartouche directly follows a sectioning command, we need the |
Line 7120 might help (with 'rm \jobname.?? \jobnam
|
Line 7197 might help (with 'rm \jobname.?? \jobnam
|
% collide with the section heading. |
% collide with the section heading. |
\ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi |
\ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi |
% |
% |
\setbox\groupbox=\vbox\bgroup |
\setbox\groupbox=\vtop\bgroup |
\baselineskip=0pt\parskip=0pt\lineskip=0pt |
\baselineskip=0pt\parskip=0pt\lineskip=0pt |
\carttop |
\carttop |
\hbox\bgroup |
\hbox\bgroup |
\hskip\lskip |
\hskip\lskip |
\vrule\kern3pt |
\vrule\kern3pt |
\vbox\bgroup |
\vbox\bgroup |
\kern3pt |
\hsize=\cartinner |
\hsize=\cartinner |
\baselineskip=\normbskip |
\baselineskip=\normbskip |
\lineskip=\normlskip |
\lineskip=\normlskip |
\parskip=\normpskip |
\parskip=\normpskip |
\def\arg{#1}% |
\vskip -\parskip |
\ifx\arg\empty\else |
\comment % For explanation, see the end of def\group. |
\centerV{\hfil \bf #1 \hfil}% |
|
\fi |
|
\kern3pt |
|
\vskip -\parskip |
} |
} |
\def\Ecartouche{% |
\def\Ecartouche{% |
\ifhmode\par\fi |
\ifhmode\par\fi |
Line 7287 might help (with 'rm \jobname.?? \jobnam
|
Line 7367 might help (with 'rm \jobname.?? \jobnam
|
} |
} |
\let\Eraggedright\par |
\let\Eraggedright\par |
|
|
\envdef\raggedleft{% |
|
\parindent=0pt \leftskip0pt plus2em |
|
\spaceskip.3333em \xspaceskip.5em \parfillskip=0pt |
|
\hbadness=10000 % Last line will usually be underfull, so turn off |
|
% badness reporting. |
|
} |
|
\let\Eraggedleft\par |
|
|
|
\envdef\raggedcenter{% |
|
\parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em |
|
\spaceskip.3333em \xspaceskip.5em \parfillskip=0pt |
|
\hbadness=10000 % Last line will usually be underfull, so turn off |
|
% badness reporting. |
|
} |
|
\let\Eraggedcenter\par |
|
|
|
|
|
% @quotation does normal linebreaking (hence we can't use \nonfillstart) |
% @quotation does normal linebreaking (hence we can't use \nonfillstart) |
% and narrows the margins. We keep \parskip nonzero in general, since |
% and narrows the margins. We keep \parskip nonzero in general, since |
Line 7400 might help (with 'rm \jobname.?? \jobnam
|
Line 7464 might help (with 'rm \jobname.?? \jobnam
|
\endgroup |
\endgroup |
% |
% |
\def\setupverb{% |
\def\setupverb{% |
\tt % easiest (and conventionally used) font for verbatim |
\tt |
\def\par{\leavevmode\endgraf}% |
\def\par{\leavevmode\endgraf}% |
|
\parindent = 0pt |
\setcodequotes |
\setcodequotes |
\tabeightspaces |
\tabeightspaces |
% Respect line breaks, |
% Respect line breaks, |
Line 7525 might help (with 'rm \jobname.?? \jobnam
|
Line 7590 might help (with 'rm \jobname.?? \jobnam
|
% file; b) letting users define the frontmatter in as flexible order as |
% file; b) letting users define the frontmatter in as flexible order as |
% possible is desirable. |
% possible is desirable. |
% |
% |
\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} |
\def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying} |
\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} |
{\catcode`\ =\other |
% |
\gdef\docopying#1@end copying{\endgroup\def\copyingtext{#1}} |
|
} |
|
|
\def\insertcopying{% |
\def\insertcopying{% |
\begingroup |
\begingroup |
\parindent = 0pt % paragraph indentation looks wrong on title page |
\parindent = 0pt % paragraph indentation looks wrong on title page |
Line 7575 might help (with 'rm \jobname.?? \jobnam
|
Line 7642 might help (with 'rm \jobname.?? \jobnam
|
\exdentamount=\defbodyindent |
\exdentamount=\defbodyindent |
} |
} |
|
|
\def\dodefunx#1{% |
% Called as \printdefunline \deffooheader{text} |
% First, check whether we are in the right environment: |
|
\checkenv#1% |
|
% |
|
% As above, allow line break if we have multiple x headers in a row. |
|
% It's not a great place, though. |
|
\ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi |
|
% |
|
% And now, it's time to reuse the body of the original defun: |
|
\expandafter\gobbledefun#1% |
|
} |
|
\def\gobbledefun#1\startdefun{} |
|
|
|
% \printdefunline \deffnheader{text} |
|
% |
% |
\def\printdefunline#1#2{% |
\def\printdefunline#1#2{% |
\begingroup |
\begingroup |
% call \deffnheader: |
\plainfrenchspacing |
|
% call \deffooheader: |
#1#2 \endheader |
#1#2 \endheader |
% common ending: |
% common ending: |
\interlinepenalty = 10000 |
\interlinepenalty = 10000 |
\advance\rightskip by 0pt plus 1fil\relax |
\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 \deffoox |
% Some of the @defun-type tags do not enable magic parentheses, |
% Some of the @defun-type tags do not enable magic parentheses, |
% rendering the following check redundant. But we don't optimize. |
% rendering the following check redundant. But we don't optimize. |
\checkparencounts |
\checkparencounts |
Line 7608 might help (with 'rm \jobname.?? \jobnam
|
Line 7663 might help (with 'rm \jobname.?? \jobnam
|
|
|
\def\Edefun{\endgraf\medbreak} |
\def\Edefun{\endgraf\medbreak} |
|
|
% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; |
% @defblock, @defline do not automatically create index entries |
% the only thing remaining is to define \deffnheader. |
\envdef\defblock{% |
|
\startdefun |
|
} |
|
\let\Edefblock\Edefun |
|
|
|
\def\defline{% |
|
\doingtypefnfalse |
|
\parseargusing\activeparens{\printdefunline\deflineheader}% |
|
} |
|
\def\deflineheader#1 #2 #3\endheader{% |
|
\printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% |
|
} |
|
|
|
\def\deftypeline{% |
|
\doingtypefntrue |
|
\parseargusing\activeparens{\printdefunline\deftypelineheader}% |
|
} |
|
\def\deftypelineheader#1 #2 #3 #4\endheader{% |
|
\printdefname{#1}{#2}{#3}\magicamp\defunargs{#4\unskip}% |
|
} |
|
|
|
% \makedefun{deffoo} (\deffooheader parameters) { (\deffooheader expansion) } |
% |
% |
|
% Define \deffoo, \deffoox \Edeffoo and \deffooheader. |
\def\makedefun#1{% |
\def\makedefun#1{% |
\expandafter\let\csname E#1\endcsname = \Edefun |
\expandafter\let\csname E#1\endcsname = \Edefun |
\edef\temp{\noexpand\domakedefun |
\edef\temp{\noexpand\domakedefun |
\makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% |
\makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% |
\temp |
\temp |
} |
} |
|
|
% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) } |
|
% |
|
% Define \deffn and \deffnx, without parameters. |
|
% \deffnheader has to be defined explicitly. |
|
% |
|
\def\domakedefun#1#2#3{% |
\def\domakedefun#1#2#3{% |
\envdef#1{% |
\envdef#1{% |
\startdefun |
\startdefun |
\doingtypefnfalse % distinguish typed functions from all else |
\doingtypefnfalse % distinguish typed functions from all else |
\parseargusing\activeparens{\printdefunline#3}% |
\parseargusing\activeparens{\printdefunline#3}% |
}% |
}% |
\def#2{\dodefunx#1}% |
\def#2{% |
\def#3% |
% First, check whether we are in the right environment: |
|
\checkenv#1% |
|
% |
|
% As in \startdefun, allow line break if we have multiple x headers |
|
% in a row. It's not a great place, though. |
|
\ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi |
|
% |
|
\doingtypefnfalse % distinguish typed functions from all else |
|
\parseargusing\activeparens{\printdefunline#3}% |
|
}% |
|
\def#3% definition of \deffooheader follows |
} |
} |
|
|
\newif\ifdoingtypefn % doing typed function? |
\newif\ifdoingtypefn % doing typed function? |
Line 7655 might help (with 'rm \jobname.?? \jobnam
|
Line 7736 might help (with 'rm \jobname.?? \jobnam
|
\fi\fi |
\fi\fi |
} |
} |
|
|
% \dosubind {index}{topic}{subtopic} |
|
% |
|
% If SUBTOPIC is present, precede it with a space, and call \doind. |
|
% (At some time during the 20th century, this made a two-level entry in an |
|
% index such as the operation index. Nobody seemed to notice the change in |
|
% behaviour though.) |
|
\def\dosubind#1#2#3{% |
|
\def\thirdarg{#3}% |
|
\ifx\thirdarg\empty |
|
\doind{#1}{#2}% |
|
\else |
|
\doind{#1}{#2\space#3}% |
|
\fi |
|
} |
|
|
|
% Untyped functions: |
% Untyped functions: |
|
|
% @deffn category name args |
% @deffn category name args |
\makedefun{deffn}{\deffngeneral{}} |
\makedefun{deffn}#1 #2 #3\endheader{% |
|
\doind{fn}{\code{#2}}% |
% @deffn category class name args |
\printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% |
\makedefun{defop}#1 {\defopon{#1\ \putwordon}} |
} |
|
|
% \defopon {category on}class name args |
|
\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } |
|
|
|
% \deffngeneral {subind}category name args |
% @defop category class name args |
% |
\makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}} |
\def\deffngeneral#1#2 #3 #4\endheader{% |
\def\defopheaderx#1#2 #3 #4\endheader{% |
\dosubind{fn}{\code{#3}}{#1}% |
\doind{fn}{\code{#3}\space\putwordon\ \code{#2}}% |
\defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% |
\printdefname{#1\ \code{#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}#1 #2 #3 #4\endheader{% |
|
\doind{fn}{\code{#3}}% |
|
\doingtypefntrue |
|
\printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% |
|
} |
|
|
% @deftypeop category class type name args |
% @deftypeop category class type name args |
\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} |
\makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}} |
|
\def\deftypeopheaderx#1#2 #3 #4 #5\endheader{% |
% \deftypeopon {category on}class type name args |
\doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}% |
\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } |
|
|
|
% \deftypefngeneral {subind}category type name args |
|
% |
|
\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% |
|
\dosubind{fn}{\code{#4}}{#1}% |
|
\doingtypefntrue |
\doingtypefntrue |
\defname{#2}{#3}{#4}\defunargs{#5\unskip}% |
\printdefname{#1\ \code{#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}#1 #2 #3 #4\endheader{% |
|
\doind{vr}{\code{#3}}% |
|
\printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% |
|
} |
|
|
% @deftypecv category class type var args |
% @deftypecv category class type var args |
\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} |
\makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}} |
|
\def\deftypecvheaderx#1#2 #3 #4 #5\endheader{% |
% \deftypecvof {category of}class type var args |
\doind{vr}{\code{#4}\space\putwordof\ \code{#2}}% |
\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } |
\printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}% |
|
|
% \deftypecvgeneral {subind}category type var args |
|
% |
|
\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% |
|
\dosubind{vr}{\code{#4}}{#1}% |
|
\defname{#2}{#3}{#4}\defunargs{#5\unskip}% |
|
} |
} |
|
|
% Untyped variables: |
% Untyped variables: |
Line 7731 might help (with 'rm \jobname.?? \jobnam
|
Line 7789 might help (with 'rm \jobname.?? \jobnam
|
\makedefun{defvr}#1 {\deftypevrheader{#1} {} } |
\makedefun{defvr}#1 {\deftypevrheader{#1} {} } |
|
|
% @defcv category class var args |
% @defcv category class var args |
\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} |
\makedefun{defcv}#1 {\defcvheaderx{#1\ \putwordof}} |
|
\def\defcvheaderx#1#2 {\deftypecvheaderx{#1}#2 {} } |
% \defcvof {category of}class var args |
|
\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } |
|
|
|
% Types: |
% 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}}% |
\defname{#1}{}{#2}\defunargs{#3\unskip}% |
\printdefname{#1}{}{#2}\defunargs{#3\unskip}% |
} |
} |
|
|
% Remaining @defun-like shortcuts: |
% Remaining @defun-like shortcuts: |
Line 7752 might help (with 'rm \jobname.?? \jobnam
|
Line 7808 might help (with 'rm \jobname.?? \jobnam
|
\makedefun{defvar}{\defvrheader{\putwordDefvar} } |
\makedefun{defvar}{\defvrheader{\putwordDefvar} } |
\makedefun{defopt}{\defvrheader{\putwordDefopt} } |
\makedefun{defopt}{\defvrheader{\putwordDefopt} } |
\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } |
\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } |
\makedefun{defmethod}{\defopon\putwordMethodon} |
\makedefun{defmethod}{\defopheaderx\putwordMethodon} |
\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} |
\makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon} |
\makedefun{defivar}{\defcvof\putwordInstanceVariableof} |
\makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof} |
\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} |
\makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof} |
|
|
% \defname, which formats the name of the @def (not the args). |
% \printdefname, which formats the name of the @def (not the args). |
% #1 is the category, such as "Function". |
% #1 is the category, such as "Function". |
% #2 is the return type, if any. |
% #2 is the return type, if any. |
% #3 is the function name. |
% #3 is the function name. |
% |
% |
% 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\printdefname#1#2#3{% |
\par |
\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 |
Line 7774 might help (with 'rm \jobname.?? \jobnam
|
Line 7830 might help (with 'rm \jobname.?? \jobnam
|
\rettypeownlinefalse |
\rettypeownlinefalse |
\ifdoingtypefn % doing a typed function specifically? |
\ifdoingtypefn % doing a typed function specifically? |
% then check user option for putting return type on its own line: |
% then check user option for putting return type on its own line: |
\expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else |
\ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}% |
\rettypeownlinetrue |
|
\fi |
|
\fi |
\fi |
% |
% |
% How we'll format the category name. Putting it in brackets helps |
% How we'll format the category name. Putting it in brackets helps |
Line 7820 might help (with 'rm \jobname.?? \jobnam
|
Line 7874 might help (with 'rm \jobname.?? \jobnam
|
\tolerance=10000 \hbadness=10000 |
\tolerance=10000 \hbadness=10000 |
\exdentamount=\defbodyindent |
\exdentamount=\defbodyindent |
{% |
{% |
|
\def\^^M{}% for line continuation |
|
% |
% defun fonts. We use typewriter by default (used to be bold) because: |
% defun fonts. We use typewriter by default (used to be bold) because: |
% . we're printing identifiers, they should be in tt in principle. |
% . we're printing identifiers, they should be in tt in principle. |
% . in languages with many accents, such as Czech or French, it's |
% . in languages with many accents, such as Czech or French, it's |
Line 7841 might help (with 'rm \jobname.?? \jobnam
|
Line 7897 might help (with 'rm \jobname.?? \jobnam
|
\fi % no return type |
\fi % no return type |
#3% output function name |
#3% output function name |
}% |
}% |
{\rm\enskip}% hskip 0.5 em of \rmfont |
\ifflagclear{txidefnamenospace}{% |
|
{\rm\enskip}% hskip 0.5 em of \rmfont |
|
}{}% |
% |
% |
\boldbrax |
\boldbrax |
% arguments will be output next, if any. |
% arguments will be output next, if any. |
} |
} |
|
|
% Print arguments in slanted roman (not ttsl), inconsistently with using |
% Print arguments. Use slanted for @def*, typewriter for @deftype*. |
% tt for the name. This is because literal text is sometimes needed in |
|
% the argument list (groff manual), and ttsl and tt are not very |
|
% distinguishable. Prevent hyphenation at `-' chars. |
|
% |
|
\def\defunargs#1{% |
\def\defunargs#1{% |
% use sl by default (not ttsl), |
\bgroup |
% tt for the names. |
\def\^^M{}% for line continuation |
\df \sl \hyphenchar\font=0 |
\df \ifdoingtypefn \tt \else \sl \fi |
% |
\ifflagclear{txicodevaristt}{}% |
% On the other hand, if an argument has two dashes (for instance), we |
{\def\var##1{{\setregularquotes \ttsl ##1}}}% |
% want a way to get ttsl. We used to recommend @var for that, so |
#1% |
% leave the code in, but it's strange for @var to lead to typewriter. |
\egroup |
% Nowadays we recommend @code, since the difference between a ttsl hyphen |
|
% and a tt hyphen is pretty tiny. @code also disables ?` !`. |
|
\def\var##1{{\setregularquotes\ttslanted{##1}}}% |
|
#1% |
|
\sl\hyphenchar\font=45 |
|
} |
} |
|
|
% We want ()&[] to print specially on the defun line. |
% We want ()&[] to print specially on the defun line. |
Line 7883 might help (with 'rm \jobname.?? \jobnam
|
Line 7932 might help (with 'rm \jobname.?? \jobnam
|
% so TeX would otherwise complain about undefined control sequence. |
% so TeX would otherwise complain about undefined control sequence. |
{ |
{ |
\activeparens |
\activeparens |
\global\let(=\lparen \global\let)=\rparen |
\gdef\defcharsdefault{% |
\global\let[=\lbrack \global\let]=\rbrack |
\let(=\lparen \let)=\rparen |
\global\let& = \& |
\let[=\lbrack \let]=\rbrack |
|
\let& = \&% |
|
} |
|
\globaldefs=1 \defcharsdefault |
|
|
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} |
\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} |
\gdef\magicamp{\let&=\amprm} |
\gdef\magicamp{\let&=\amprm} |
Line 7896 might help (with 'rm \jobname.?? \jobnam
|
Line 7948 might help (with 'rm \jobname.?? \jobnam
|
|
|
% If we encounter &foo, then turn on ()-hacking afterwards |
% If we encounter &foo, then turn on ()-hacking afterwards |
\newif\ifampseen |
\newif\ifampseen |
\def\amprm#1 {\ampseentrue{\bf\ }} |
\def\amprm#1 {\ampseentrue{\rm\ }} |
|
|
\def\parenfont{% |
\def\parenfont{% |
\ifampseen |
\ifampseen |
Line 8069 might help (with 'rm \jobname.?? \jobnam
|
Line 8121 might help (with 'rm \jobname.?? \jobnam
|
\catcode`\_=\other |
\catcode`\_=\other |
\catcode`\|=\other |
\catcode`\|=\other |
\catcode`\~=\other |
\catcode`\~=\other |
\passthroughcharstrue |
|
} |
|
|
|
\def\scanargctxt{% used for copying and captions, not macros. |
|
\scanctxt |
|
\catcode`\@=\other |
\catcode`\@=\other |
\catcode`\\=\other |
|
\catcode`\^^M=\other |
\catcode`\^^M=\other |
|
\catcode`\\=\active |
|
\passthroughcharstrue |
} |
} |
|
|
\def\macrobodyctxt{% used for @macro definitions |
\def\macrobodyctxt{% used for @macro definitions and @copying |
\scanctxt |
\scanctxt |
\catcode`\ =\other |
\catcode`\ =\other |
\catcode`\@=\other |
|
\catcode`\{=\other |
\catcode`\{=\other |
\catcode`\}=\other |
\catcode`\}=\other |
\catcode`\^^M=\other |
|
\usembodybackslash |
|
} |
} |
|
|
% Used when scanning braced macro arguments. Note, however, that catcode |
% Used when scanning braced macro arguments. Note, however, that catcode |
Line 8095 might help (with 'rm \jobname.?? \jobnam
|
Line 8140 might help (with 'rm \jobname.?? \jobnam
|
\def\macroargctxt{% |
\def\macroargctxt{% |
\scanctxt |
\scanctxt |
\catcode`\ =\active |
\catcode`\ =\active |
\catcode`\@=\other |
|
\catcode`\^^M=\other |
|
\catcode`\\=\active |
|
} |
} |
|
|
\def\macrolineargctxt{% used for whole-line arguments without braces |
\def\macrolineargctxt{% used for whole-line arguments without braces |
\scanctxt |
\scanctxt |
\catcode`\@=\other |
|
\catcode`\{=\other |
\catcode`\{=\other |
\catcode`\}=\other |
\catcode`\}=\other |
} |
} |
Line 8146 might help (with 'rm \jobname.?? \jobnam
|
Line 8187 might help (with 'rm \jobname.?? \jobnam
|
\global\expandafter\let\csname ismacro.\the\macname\endcsname=1% |
\global\expandafter\let\csname ismacro.\the\macname\endcsname=1% |
\addtomacrolist{\the\macname}% |
\addtomacrolist{\the\macname}% |
\fi |
\fi |
\begingroup \macrobodyctxt |
\begingroup \macrobodyctxt \usembodybackslash |
\ifrecursive \expandafter\parsermacbody |
\ifrecursive \expandafter\parsermacbody |
\else \expandafter\parsemacbody |
\else \expandafter\parsemacbody |
\fi} |
\fi} |
Line 8161 might help (with 'rm \jobname.?? \jobnam
|
Line 8202 might help (with 'rm \jobname.?? \jobnam
|
\let\commondummyword\unmacrodo |
\let\commondummyword\unmacrodo |
\xdef\macrolist{\macrolist}% |
\xdef\macrolist{\macrolist}% |
\endgroup |
\endgroup |
\else |
|
\errmessage{Macro #1 not defined}% |
|
\fi |
\fi |
} |
} |
|
|
Line 8229 might help (with 'rm \jobname.?? \jobnam
|
Line 8268 might help (with 'rm \jobname.?? \jobnam
|
% Read recursive and nonrecursive macro bodies. (They're different since |
% Read recursive and nonrecursive macro bodies. (They're different since |
% rec and nonrec macros end differently.) |
% rec and nonrec macros end differently.) |
% |
% |
% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro |
% We are in \macrobodyctxt, and the \xdef causes backslashes in the macro |
% body to be transformed. |
% body to be transformed. |
% Set \macrobody to the body of the macro, and call \defmacro. |
% Set \macrobody to the body of the macro, and call \macrodef. |
% |
% |
{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% |
{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% |
\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% |
\xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% |
{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% |
{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% |
\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% |
\xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% |
|
|
% Make @ a letter, so that we can make private-to-Texinfo macro names. |
% Make @ a letter, so that we can make private-to-Texinfo macro names. |
\edef\texiatcatcode{\the\catcode`\@} |
\edef\texiatcatcode{\the\catcode`\@} |
Line 8455 might help (with 'rm \jobname.?? \jobnam
|
Line 8494 might help (with 'rm \jobname.?? \jobnam
|
% \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\macrodef{% |
\let\hash=##% convert placeholders to macro parameter chars |
\let\hash=##% convert placeholders to macro parameter chars |
\ifnum\paramno=1 |
\ifnum\paramno=1 |
\def\xeatspaces##1{##1}% |
\long\def\xeatspaces##1{##1}% |
% This removes the pair of braces around the argument. We don't |
% We don't use \xeatspaces for single-argument macros, because we |
% use \eatspaces, because this can cause ends of lines to be lost |
% want to keep ends of lines. This definition removes \xeatspaces |
% when the argument to \eatspaces is read, leading to line-based |
% when \macrobody is expanded below. |
% commands like "@itemize" not being read correctly. |
\else |
\else |
\def\xeatspaces{\string\xeatspaces}% |
\let\xeatspaces\relax % suppress expansion |
% This expands \xeatspaces as a sequence of character tokens, which |
|
% stops \scantokens inserting an extra space after the control sequence. |
\fi |
\fi |
\ifcase\paramno |
\ifcase\paramno |
% 0 |
% 0 |
\expandafter\xdef\csname\the\macname\endcsname{% |
\expandafter\xdef\csname\the\macname\endcsname{% |
\bgroup |
\begingroup |
\noexpand\spaceisspace |
\noexpand\spaceisspace |
\noexpand\endlineisspace |
\noexpand\endlineisspace |
\noexpand\expandafter % skip any whitespace after the macro name. |
\noexpand\expandafter % skip any whitespace after the macro name. |
\expandafter\noexpand\csname\the\macname @@@\endcsname}% |
\expandafter\noexpand\csname\the\macname @@@\endcsname}% |
\expandafter\xdef\csname\the\macname @@@\endcsname{% |
\expandafter\xdef\csname\the\macname @@@\endcsname{% |
\egroup |
\endgroup |
\noexpand\scanmacro{\macrobody}}% |
\noexpand\scanmacro{\macrobody}}% |
\or % 1 |
\or % 1 |
\expandafter\xdef\csname\the\macname\endcsname{% |
\expandafter\xdef\csname\the\macname\endcsname{% |
\bgroup |
\begingroup |
\noexpand\braceorline |
\noexpand\braceorline |
\expandafter\noexpand\csname\the\macname @@@\endcsname}% |
\expandafter\noexpand\csname\the\macname @@@\endcsname}% |
\expandafter\xdef\csname\the\macname @@@\endcsname##1{% |
\expandafter\xdef\csname\the\macname @@@\endcsname##1{% |
\egroup |
\endgroup |
\noexpand\scanmacro{\macrobody}% |
\noexpand\scanmacro{\macrobody}% |
}% |
}% |
\else % at most 9 |
\else % at most 9 |
Line 8494 might help (with 'rm \jobname.?? \jobnam
|
Line 8534 might help (with 'rm \jobname.?? \jobnam
|
% @MACNAME@@@ removes braces surrounding the argument list. |
% @MACNAME@@@ removes braces surrounding the argument list. |
% @MACNAME@@@@ scans the macro body with arguments substituted. |
% @MACNAME@@@@ scans the macro body with arguments substituted. |
\expandafter\xdef\csname\the\macname\endcsname{% |
\expandafter\xdef\csname\the\macname\endcsname{% |
\bgroup |
\begingroup |
\noexpand\expandafter % This \expandafter skip any spaces after the |
\noexpand\expandafter % This \expandafter skip any spaces after the |
\noexpand\macroargctxt % macro before we change the catcode of space. |
\noexpand\macroargctxt % macro before we change the catcode of space. |
\noexpand\expandafter |
\noexpand\expandafter |
Line 8508 might help (with 'rm \jobname.?? \jobnam
|
Line 8548 might help (with 'rm \jobname.?? \jobnam
|
\expandafter\xdef |
\expandafter\xdef |
\expandafter\expandafter |
\expandafter\expandafter |
\csname\the\macname @@@@\endcsname\paramlist{% |
\csname\the\macname @@@@\endcsname\paramlist{% |
\egroup\noexpand\scanmacro{\macrobody}}% |
\endgroup\noexpand\scanmacro{\macrobody}}% |
\else % 10 or more: |
\else % 10 or more: |
\expandafter\xdef\csname\the\macname\endcsname{% |
\expandafter\xdef\csname\the\macname\endcsname{% |
\noexpand\getargvals@{\the\macname}{\argl}% |
\noexpand\getargvals@{\the\macname}{\argl}% |
Line 8630 might help (with 'rm \jobname.?? \jobnam
|
Line 8670 might help (with 'rm \jobname.?? \jobnam
|
\fi \macnamexxx} |
\fi \macnamexxx} |
|
|
|
|
|
% @linemacro |
|
|
|
\parseargdef\linemacro{% |
|
\getargs{#1}% now \macname is the macname and \argl the arglist |
|
\ifx\argl\empty |
|
\paramno=0 |
|
\let\hash\relax |
|
\def\paramlist{\hash 1\endlinemacro}% |
|
\else |
|
\expandafter\linegetparamlist\argl;% |
|
\fi |
|
\begingroup \macrobodyctxt \usembodybackslash |
|
\parselinemacrobody |
|
} |
|
|
|
% Build up \paramlist which will be used as the parameter text for the macro. |
|
% At the end it will be like "#1 #2 #3\endlinemacro". |
|
\def\linegetparamlist#1;{% |
|
\paramno=0\def\paramlist{}% |
|
\let\hash\relax |
|
\linegetparamlistxxx#1,;,% |
|
} |
|
\def\linegetparamlistxxx#1,{% |
|
\if#1;\let\next=\linegetparamlistxxxx |
|
\else \let\next=\linegetparamlistxxx |
|
\advance\paramno by 1 |
|
\expandafter\edef\csname macarg.\eatspaces{#1}\endcsname |
|
{\hash\the\paramno}% |
|
\edef\paramlist{\paramlist\hash\the\paramno\space}% |
|
\fi\next} |
|
\def\linegetparamlistxxxx{% |
|
\expandafter\fixparamlist\paramlist\fixparamlist |
|
} |
|
% Replace final space token |
|
\def\fixparamlist#1 \fixparamlist{% |
|
\def\paramlist{#1\endlinemacro}% |
|
} |
|
|
|
% Read the body of the macro, replacing backslash-surrounded variables |
|
% |
|
{\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{% |
|
\xdef\macrobody{#1}% |
|
\endgroup |
|
\linemacrodef |
|
}} |
|
|
|
% Make the definition |
|
\def\linemacrodef{% |
|
\let\hash=##% |
|
\expandafter\xdef\csname\the\macname\endcsname{% |
|
\bgroup |
|
\noexpand\parsearg |
|
\expandafter\noexpand\csname\the\macname @@\endcsname |
|
} |
|
\expandafter\xdef\csname\the\macname @@\endcsname##1{% |
|
\egroup |
|
\expandafter\noexpand |
|
\csname\the\macname @@@\endcsname##1\noexpand\endlinemacro |
|
} |
|
\expandafter\expandafter |
|
\expandafter\xdef |
|
\expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{% |
|
\newlinechar=13 % split \macrobody into lines |
|
\noexpand\scantokens{\macrobody}% |
|
} |
|
} |
|
|
|
|
|
|
% @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. Make them active and then expand them all to nothing. |
% sign. Make them active and then expand them all to nothing. |
Line 8681 might help (with 'rm \jobname.?? \jobnam
|
Line 8790 might help (with 'rm \jobname.?? \jobnam
|
} |
} |
\def\wordTop{Top} |
\def\wordTop{Top} |
|
|
% Until the next @node or @bye command, divert output to a box that is not |
% Until the next @node, @part or @bye command, divert output to a box that |
% output. |
% is not output. |
\def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}% |
\def\ignorenode{\setbox\dummybox\vbox\bgroup |
|
\def\part{\egroup\part}% |
|
\def\node{\egroup\node}% |
\ignorenodebye |
\ignorenodebye |
} |
} |
|
|
Line 8704 might help (with 'rm \jobname.?? \jobnam
|
Line 8815 might help (with 'rm \jobname.?? \jobnam
|
\fi |
\fi |
} |
} |
|
|
|
% @nodedescription, @nodedescriptionblock - do nothing for TeX |
|
\parseargdef\nodedescription{} |
|
\def\nodedescriptionblock{\doignore{nodedescriptionblock}} |
|
|
|
|
% @anchor{NAME} -- define xref target at arbitrary point. |
% @anchor{NAME} -- define xref target at arbitrary point. |
% |
% |
\newcount\savesfregister |
\newcount\savesfregister |
Line 8785 might help (with 'rm \jobname.?? \jobnam
|
Line 8901 might help (with 'rm \jobname.?? \jobnam
|
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup |
\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup |
\unsepspaces |
\unsepspaces |
% |
% |
% Get args without leading/trailing spaces. |
\getprintedrefname{#1}{#3}{#5}% |
\def\printedrefname{\ignorespaces #3}% |
|
\setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% |
|
% |
|
\def\infofilename{\ignorespaces #4}% |
\def\infofilename{\ignorespaces #4}% |
\setbox\infofilenamebox = \hbox{\infofilename\unskip}% |
\setbox\infofilenamebox = \hbox{\infofilename\unskip}% |
% |
% |
\def\printedmanual{\ignorespaces #5}% |
\startxreflink{#1}{#4}% |
\setbox\printedmanualbox = \hbox{\printedmanual\unskip}% |
|
% |
|
% If the printed reference name (arg #3) was not explicitly given in |
|
% the @xref, figure out what we want to use. |
|
\ifdim \wd\printedrefnamebox = 0pt |
|
% No printed node name was explicitly given. |
|
\expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax |
|
% Not auto section-title: use node name inside the square brackets. |
|
\def\printedrefname{\ignorespaces #1}% |
|
\else |
|
% Auto section-title: use chapter/section title inside |
|
% the square brackets if we have it. |
|
\ifdim \wd\printedmanualbox > 0pt |
|
% It is in another manual, so we don't have it; use node name. |
|
\def\printedrefname{\ignorespaces #1}% |
|
\else |
|
\ifhavexrefs |
|
% We (should) know the real title if we have the xref values. |
|
\def\printedrefname{\refx{#1-title}}% |
|
\else |
|
% Otherwise just copy the Info node name. |
|
\def\printedrefname{\ignorespaces #1}% |
|
\fi% |
|
\fi |
|
\fi |
|
\fi |
|
% |
|
% Make link in pdf output. |
|
\ifpdf |
|
% For pdfTeX and LuaTeX |
|
{\indexnofonts |
|
\makevalueexpandable |
|
\turnoffactive |
|
% This expands tokens, so do it after making catcode changes, so _ |
|
% etc. don't get their TeX definitions. This ignores all spaces in |
|
% #4, including (wrongly) those in the middle of the filename. |
|
\getfilename{#4}% |
|
% |
|
% This (wrongly) does not take account of leading or trailing |
|
% spaces in #1, which should be ignored. |
|
\setpdfdestname{#1}% |
|
% |
|
\ifx\pdfdestname\empty |
|
\def\pdfdestname{Top}% no empty targets |
|
\fi |
|
% |
|
\leavevmode |
|
\startlink attr{/Border [0 0 0]}% |
|
\ifnum\filenamelength>0 |
|
goto file{\the\filename.pdf} name{\pdfdestname}% |
|
\else |
|
goto name{\pdfmkpgn{\pdfdestname}}% |
|
\fi |
|
}% |
|
\setcolor{\linkcolor}% |
|
\else |
|
\ifx\XeTeXrevision\thisisundefined |
|
\else |
|
% For XeTeX |
|
{\indexnofonts |
|
\makevalueexpandable |
|
\turnoffactive |
|
% This expands tokens, so do it after making catcode changes, so _ |
|
% etc. don't get their TeX definitions. This ignores all spaces in |
|
% #4, including (wrongly) those in the middle of the filename. |
|
\getfilename{#4}% |
|
% |
|
% This (wrongly) does not take account of leading or trailing |
|
% spaces in #1, which should be ignored. |
|
\setpdfdestname{#1}% |
|
% |
|
\ifx\pdfdestname\empty |
|
\def\pdfdestname{Top}% no empty targets |
|
\fi |
|
% |
|
\leavevmode |
|
\ifnum\filenamelength>0 |
|
% With default settings, |
|
% XeTeX (xdvipdfmx) replaces link destination names with integers. |
|
% In this case, the replaced destination names of |
|
% remote PDFs are no longer known. In order to avoid a replacement, |
|
% you can use xdvipdfmx's command line option `-C 0x0010'. |
|
% If you use XeTeX 0.99996+ (TeX Live 2016+), |
|
% this command line option is no longer necessary |
|
% because we can use the `dvipdfmx:config' special. |
|
\special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A |
|
<< /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}% |
|
\else |
|
\special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A |
|
<< /S /GoTo /D (\pdfdestname) >> >>}% |
|
\fi |
|
}% |
|
\setcolor{\linkcolor}% |
|
\fi |
|
\fi |
|
{% |
{% |
% Have to otherify everything special to allow the \csname to |
% Have to otherify everything special to allow the \csname to |
% include an _ in the xref name, etc. |
% include an _ in the xref name, etc. |
Line 8948 might help (with 'rm \jobname.?? \jobnam
|
Line 8966 might help (with 'rm \jobname.?? \jobnam
|
% output the `[mynode]' via the macro below so it can be overridden. |
% output the `[mynode]' via the macro below so it can be overridden. |
\xrefprintnodename\printedrefname |
\xrefprintnodename\printedrefname |
% |
% |
\expandafter\ifx\csname SETtxiomitxrefpg\endcsname\relax |
\ifflagclear{txiomitxrefpg}{% |
% But we always want a comma and a space: |
% We always want a comma |
,\space |
,% |
% |
|
% output the `page 3'. |
% output the `page 3'. |
\turnoffactive \putwordpage\tie\refx{#1-pg}% |
\turnoffactive \putpageref{#1}% |
% Add a , if xref followed by a space |
% Add a , if xref followed by a space |
\if\space\noexpand\tokenafterxref ,% |
\if\space\noexpand\tokenafterxref ,% |
\else\ifx\ \tokenafterxref ,% @TAB |
\else\ifx\ \tokenafterxref ,% @TAB |
Line 8963 might help (with 'rm \jobname.?? \jobnam
|
Line 8980 might help (with 'rm \jobname.?? \jobnam
|
\tokenafterxref ,% @NL |
\tokenafterxref ,% @NL |
\else\ifx\tie\tokenafterxref ,% @tie |
\else\ifx\tie\tokenafterxref ,% @tie |
\fi\fi\fi\fi\fi\fi |
\fi\fi\fi\fi\fi\fi |
\fi |
}{}% |
\fi\fi |
\fi\fi |
\fi |
\fi |
\endlink |
\endlink |
\endgroup} |
\endgroup} |
|
|
|
% \getprintedrefname{NODE}{LABEL}{MANUAL} |
|
% - set \printedrefname and \printedmanual |
|
% |
|
\def\getprintedrefname#1#2#3{% |
|
% Get args without leading/trailing spaces. |
|
\def\printedrefname{\ignorespaces #2}% |
|
\setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% |
|
% |
|
\def\printedmanual{\ignorespaces #3}% |
|
\setbox\printedmanualbox = \hbox{\printedmanual\unskip}% |
|
% |
|
% If the printed reference name (arg #2) was not explicitly given in |
|
% the @xref, figure out what we want to use. |
|
\ifdim \wd\printedrefnamebox = 0pt |
|
% No printed node name was explicitly given. |
|
\expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax |
|
% Not auto section-title: use node name inside the square brackets. |
|
\def\printedrefname{\ignorespaces #1}% |
|
\else |
|
% Auto section-title: use chapter/section title inside |
|
% the square brackets if we have it. |
|
\ifdim \wd\printedmanualbox > 0pt |
|
% It is in another manual, so we don't have it; use node name. |
|
\def\printedrefname{\ignorespaces #1}% |
|
\else |
|
\ifhavexrefs |
|
% We (should) know the real title if we have the xref values. |
|
\def\printedrefname{\refx{#1-title}}% |
|
\else |
|
% Otherwise just copy the Info node name. |
|
\def\printedrefname{\ignorespaces #1}% |
|
\fi% |
|
\fi |
|
\fi |
|
\fi |
|
} |
|
|
|
% \startxreflink{NODE}{FILE} - start link in pdf output. |
|
\def\startxreflink#1#2{% |
|
\ifpdforxetex |
|
% For pdfTeX and LuaTeX |
|
{\indexnofonts |
|
\makevalueexpandable |
|
\turnoffactive |
|
% This expands tokens, so do it after making catcode changes, so _ |
|
% etc. don't get their TeX definitions. This ignores all spaces in |
|
% #2, including (wrongly) those in the middle of the filename. |
|
\getfilename{#2}% |
|
% |
|
% This (wrongly) does not take account of leading or trailing |
|
% spaces in #1, which should be ignored. |
|
\setpdfdestname{#1}% |
|
% |
|
\ifx\pdfdestname\empty |
|
\def\pdfdestname{Top}% no empty targets |
|
\fi |
|
% |
|
\leavevmode |
|
\ifpdf |
|
\startlink attr{/Border [0 0 0]}% |
|
\ifnum\filenamelength>0 |
|
goto file{\the\filename.pdf} name{\pdfdestname}% |
|
\else |
|
goto name{\pdfmkpgn{\pdfdestname}}% |
|
\fi |
|
\else % XeTeX |
|
\ifnum\filenamelength>0 |
|
% With default settings, |
|
% XeTeX (xdvipdfmx) replaces link destination names with integers. |
|
% In this case, the replaced destination names of |
|
% remote PDFs are no longer known. In order to avoid a replacement, |
|
% you can use xdvipdfmx's command line option `-C 0x0010'. |
|
% If you use XeTeX 0.99996+ (TeX Live 2016+), |
|
% this command line option is no longer necessary |
|
% because we can use the `dvipdfmx:config' special. |
|
\special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A |
|
<< /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}% |
|
\else |
|
\special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A |
|
<< /S /GoTo /D (\pdfdestname) >> >>}% |
|
\fi |
|
\fi |
|
}% |
|
\setcolor{\linkcolor}% |
|
\fi |
|
} |
|
|
|
% can be overridden in translation files |
|
\def\putpageref#1{% |
|
\space\putwordpage\tie\refx{#1-pg}} |
|
|
% Output a cross-manual xref to #1. Used just above (twice). |
% Output a cross-manual xref to #1. Used just above (twice). |
% |
% |
% Only include the text "Section ``foo'' in" if the foo is neither |
% Only include the text "Section ``foo'' in" if the foo is neither |
Line 9002 might help (with 'rm \jobname.?? \jobnam
|
Line 9110 might help (with 'rm \jobname.?? \jobnam
|
% |
% |
\def\xrefprintnodename#1{[#1]} |
\def\xrefprintnodename#1{[#1]} |
|
|
|
% @link{NODENAME, LABEL, MANUAL} - create a "plain" link, with no |
|
% page number. Not useful if printed on paper. |
|
% |
|
\def\link#1{\linkX[#1,,,]} |
|
\def\linkX[#1,#2,#3,#4]{% |
|
\begingroup |
|
\unsepspaces |
|
\getprintedrefname{#1}{#2}{#3}% |
|
\startxreflink{#1}{#3}% |
|
\printedrefname |
|
\endlink |
|
\endgroup |
|
} |
|
|
|
|
% Things referred to by \setref. |
% Things referred to by \setref. |
% |
% |
\def\Ynothing{} |
\def\Ynothing{} |
Line 9380 might help (with 'rm \jobname.?? \jobnam
|
Line 9503 might help (with 'rm \jobname.?? \jobnam
|
\imagexxx #1,,,,,\finish |
\imagexxx #1,,,,,\finish |
\fi |
\fi |
} |
} |
|
|
|
% Approximate height of a line in the standard text font. |
|
\newdimen\capheight |
|
\setbox0=\vbox{\tenrm H} |
|
\capheight=\ht0 |
|
|
% |
% |
% Arguments to @image: |
% Arguments to @image: |
% #1 is (mandatory) image filename; we tack on .eps extension. |
% #1 is (mandatory) image filename; we tack on .eps extension. |
Line 9392 might help (with 'rm \jobname.?? \jobnam
|
Line 9521 might help (with 'rm \jobname.?? \jobnam
|
\catcode`\^^M = 5 % in case we're inside an example |
\catcode`\^^M = 5 % in case we're inside an example |
\normalturnoffactive % allow _ et al. in names |
\normalturnoffactive % allow _ et al. in names |
\makevalueexpandable |
\makevalueexpandable |
% If the image is by itself, center it. |
|
\ifvmode |
\ifvmode |
\imagevmodetrue |
\imagevmodetrue |
\else \ifx\centersub\centerV |
\medskip |
% for @center @image, we need a vbox so we can have our vertical space |
|
\imagevmodetrue |
|
\vbox\bgroup % vbox has better behavior than vtop herev |
|
\fi\fi |
|
% |
|
\ifimagevmode |
|
\nobreak\medskip |
|
% Usually we'll have text after the image which will insert |
% Usually we'll have text after the image which will insert |
% \parskip glue, so insert it here too to equalize the space |
% \parskip glue, so insert it here too to equalize the space |
% above and below. |
% above and below. |
\nobreak\vskip\parskip |
\vskip\parskip |
\nobreak |
% |
|
% Place image in a \vtop for a top page margin that is (close to) correct, |
|
% as \topskip glue is relative to the first baseline. |
|
\vtop\bgroup \kern -\capheight \vskip-\parskip |
\fi |
\fi |
% |
% |
% Leave vertical mode so that indentation from an enclosing |
\ifx\centersub\centerV |
% environment such as @quotation is respected. |
% For @center @image, enter vertical mode and add vertical space |
% However, if we're at the top level, we don't want the |
% Enter an extra \parskip because @center doesn't add space itself. |
% normal paragraph indentation. |
\vbox\bgroup\vskip\parskip\medskip\vskip\parskip |
% On the other hand, if we are in the case of @center @image, we don't |
\else |
% want to start a paragraph, which will create a hsize-width box and |
% Enter horizontal mode so that indentation from an enclosing |
% eradicate the centering. |
% environment such as @quotation is respected. |
\ifx\centersub\centerV \else \imageindent \fi |
% However, if we're at the top level, we don't want the |
|
% normal paragraph indentation. |
|
\imageindent |
|
\fi |
% |
% |
% Output the image. |
% Output the image. |
\ifpdf |
\ifpdf |
Line 9439 might help (with 'rm \jobname.?? \jobnam
|
Line 9566 might help (with 'rm \jobname.?? \jobnam
|
\fi |
\fi |
% |
% |
\ifimagevmode |
\ifimagevmode |
|
\egroup |
\medskip % space after a standalone image |
\medskip % space after a standalone image |
\fi |
\fi |
\ifx\centersub\centerV \egroup \fi |
\ifx\centersub\centerV % @center @image |
|
\medskip |
|
\egroup % close \vbox |
|
\fi |
\endgroup} |
\endgroup} |
|
|
|
|
Line 9608 might help (with 'rm \jobname.?? \jobnam
|
Line 9739 might help (with 'rm \jobname.?? \jobnam
|
% |
% |
\def\caption{\docaption\thiscaption} |
\def\caption{\docaption\thiscaption} |
\def\shortcaption{\docaption\thisshortcaption} |
\def\shortcaption{\docaption\thisshortcaption} |
\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} |
\def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz} |
\def\defcaption#1#2{\egroup \def#1{#2}} |
\def\docaptionz#1#2{\egroup \def#1{#2}} |
|
|
% The parameter is the control sequence identifying the counter we are |
% The parameter is the control sequence identifying the counter we are |
% going to use. Create it if it doesn't exist and assign it to \floatno. |
% going to use. Create it if it doesn't exist and assign it to \floatno. |
Line 9898 directory should work if nowhere else do
|
Line 10029 directory should work if nowhere else do
|
% For native Unicode handling (XeTeX and LuaTeX) |
% For native Unicode handling (XeTeX and LuaTeX) |
\nativeunicodechardefs |
\nativeunicodechardefs |
\else |
\else |
% For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX) |
% For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX). |
|
% Since we already invoke \utfeightchardefs at the top level, |
|
% making non-ascii chars active is sufficient. |
\setnonasciicharscatcode\active |
\setnonasciicharscatcode\active |
% since we already invoked \utfeightchardefs at the top level |
|
% (below), do not re-invoke it, otherwise our check for duplicated |
|
% definitions gets triggered. Making non-ascii chars active is |
|
% sufficient. |
|
\fi |
\fi |
% |
% |
\else |
\else |
Line 9928 directory should work if nowhere else do
|
Line 10057 directory should work if nowhere else do
|
\fi |
\fi |
} |
} |
|
|
% emacs-page |
|
% A message to be logged when using a character that isn't available |
% A message to be logged when using a character that isn't available |
% the default font encoding (OT1). |
% the default font encoding (OT1). |
% |
% |
Line 9937 directory should work if nowhere else do
|
Line 10065 directory should work if nowhere else do
|
% Take account of \c (plain) vs. \, (Texinfo) difference. |
% Take account of \c (plain) vs. \, (Texinfo) difference. |
\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} |
\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} |
|
|
% First, make active non-ASCII characters in order for them to be |
|
% correctly categorized when TeX reads the replacement text of |
|
% macros containing the character definitions. |
|
\setnonasciicharscatcode\active |
|
% |
|
|
|
\def\gdefchar#1#2{% |
\def\gdefchar#1#2{% |
\gdef#1{% |
\gdef#1{% |
\ifpassthroughchars |
\ifpassthroughchars |
Line 9952 directory should work if nowhere else do
|
Line 10074 directory should work if nowhere else do
|
\fi |
\fi |
}} |
}} |
|
|
|
\begingroup |
|
|
|
% Make non-ASCII characters active for defining the character definition |
|
% macros. |
|
\setnonasciicharscatcode\active |
|
|
% Latin1 (ISO-8859-1) character definitions. |
% Latin1 (ISO-8859-1) character definitions. |
\def\latonechardefs{% |
\gdef\latonechardefs{% |
\gdefchar^^a0{\tie} |
\gdefchar^^a0{\tie} |
\gdefchar^^a1{\exclamdown} |
\gdefchar^^a1{\exclamdown} |
\gdefchar^^a2{{\tcfont \char162}} % cent |
\gdefchar^^a2{{\tcfont \char162}} % cent |
Line 10058 directory should work if nowhere else do
|
Line 10186 directory should work if nowhere else do
|
} |
} |
|
|
% Latin9 (ISO-8859-15) encoding character definitions. |
% Latin9 (ISO-8859-15) encoding character definitions. |
\def\latninechardefs{% |
\gdef\latninechardefs{% |
% Encoding is almost identical to Latin1. |
% Encoding is almost identical to Latin1. |
\latonechardefs |
\latonechardefs |
% |
% |
Line 10073 directory should work if nowhere else do
|
Line 10201 directory should work if nowhere else do
|
} |
} |
|
|
% Latin2 (ISO-8859-2) character definitions. |
% Latin2 (ISO-8859-2) character definitions. |
\def\lattwochardefs{% |
\gdef\lattwochardefs{% |
\gdefchar^^a0{\tie} |
\gdefchar^^a0{\tie} |
\gdefchar^^a1{\ogonek{A}} |
\gdefchar^^a1{\ogonek{A}} |
\gdefchar^^a2{\u{}} |
\gdefchar^^a2{\u{}} |
Line 10091 directory should work if nowhere else do
|
Line 10219 directory should work if nowhere else do
|
\gdefchar^^ae{\v Z} |
\gdefchar^^ae{\v Z} |
\gdefchar^^af{\dotaccent Z} |
\gdefchar^^af{\dotaccent Z} |
% |
% |
\gdefchar^^b0{\textdegree{}} |
\gdefchar^^b0{\textdegree} |
\gdefchar^^b1{\ogonek{a}} |
\gdefchar^^b1{\ogonek{a}} |
\gdefchar^^b2{\ogonek{ }} |
\gdefchar^^b2{\ogonek{ }} |
\gdefchar^^b3{\l} |
\gdefchar^^b3{\l} |
Line 10177 directory should work if nowhere else do
|
Line 10305 directory should work if nowhere else do
|
\gdefchar^^ff{\dotaccent{}} |
\gdefchar^^ff{\dotaccent{}} |
} |
} |
|
|
|
\endgroup % active chars |
|
|
% UTF-8 character definitions. |
% UTF-8 character definitions. |
% |
% |
% This code to support UTF-8 is based on LaTeX's utf8.def, with some |
% This code to support UTF-8 is based on LaTeX's utf8.def, with some |
Line 10328 directory should work if nowhere else do
|
Line 10458 directory should work if nowhere else do
|
% Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp |
% Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp |
% to the corresponding UTF-8 sequence. |
% to the corresponding UTF-8 sequence. |
\gdef\parseXMLCharref{% |
\gdef\parseXMLCharref{% |
\ifnum\countUTFz < "A0\relax |
\ifnum\countUTFz < "20\relax |
\errhelp = \EMsimple |
\errhelp = \EMsimple |
\errmessage{Cannot define Unicode char value < 00A0}% |
\errmessage{Cannot define Unicode char value < 0020}% |
\else\ifnum\countUTFz < "800\relax |
\else\ifnum\countUTFz < "800\relax |
\parseUTFviiiA,% |
\parseUTFviiiA,% |
\parseUTFviiiB C\UTFviiiTwoOctetsName.,% |
\parseUTFviiiB C\UTFviiiTwoOctetsName.,% |
Line 10400 directory should work if nowhere else do
|
Line 10530 directory should work if nowhere else do
|
% least make most of the characters not bomb out. |
% least make most of the characters not bomb out. |
% |
% |
\def\unicodechardefs{% |
\def\unicodechardefs{% |
|
\DeclareUnicodeCharacter{0020}{ } % space |
|
\DeclareUnicodeCharacter{0021}{\char"21 }% % space to terminate number |
|
\DeclareUnicodeCharacter{0022}{\char"22 }% |
|
\DeclareUnicodeCharacter{0023}{\char"23 }% |
|
\DeclareUnicodeCharacter{0024}{\char"24 }% |
|
\DeclareUnicodeCharacter{0025}{\char"25 }% |
|
\DeclareUnicodeCharacter{0026}{\char"26 }% |
|
\DeclareUnicodeCharacter{0027}{\char"27 }% |
|
\DeclareUnicodeCharacter{0028}{\char"28 }% |
|
\DeclareUnicodeCharacter{0029}{\char"29 }% |
|
\DeclareUnicodeCharacter{002A}{\char"2A }% |
|
\DeclareUnicodeCharacter{002B}{\char"2B }% |
|
\DeclareUnicodeCharacter{002C}{\char"2C }% |
|
\DeclareUnicodeCharacter{002D}{\char"2D }% |
|
\DeclareUnicodeCharacter{002E}{\char"2E }% |
|
\DeclareUnicodeCharacter{002F}{\char"2F }% |
|
\DeclareUnicodeCharacter{0030}{0}% |
|
\DeclareUnicodeCharacter{0031}{1}% |
|
\DeclareUnicodeCharacter{0032}{2}% |
|
\DeclareUnicodeCharacter{0033}{3}% |
|
\DeclareUnicodeCharacter{0034}{4}% |
|
\DeclareUnicodeCharacter{0035}{5}% |
|
\DeclareUnicodeCharacter{0036}{6}% |
|
\DeclareUnicodeCharacter{0037}{7}% |
|
\DeclareUnicodeCharacter{0038}{8}% |
|
\DeclareUnicodeCharacter{0039}{9}% |
|
\DeclareUnicodeCharacter{003A}{\char"3A }% |
|
\DeclareUnicodeCharacter{003B}{\char"3B }% |
|
\DeclareUnicodeCharacter{003C}{\char"3C }% |
|
\DeclareUnicodeCharacter{003D}{\char"3D }% |
|
\DeclareUnicodeCharacter{003E}{\char"3E }% |
|
\DeclareUnicodeCharacter{003F}{\char"3F }% |
|
\DeclareUnicodeCharacter{0040}{\char"40 }% |
|
\DeclareUnicodeCharacter{0041}{A}% |
|
\DeclareUnicodeCharacter{0042}{B}% |
|
\DeclareUnicodeCharacter{0043}{C}% |
|
\DeclareUnicodeCharacter{0044}{D}% |
|
\DeclareUnicodeCharacter{0045}{E}% |
|
\DeclareUnicodeCharacter{0046}{F}% |
|
\DeclareUnicodeCharacter{0047}{G}% |
|
\DeclareUnicodeCharacter{0048}{H}% |
|
\DeclareUnicodeCharacter{0049}{I}% |
|
\DeclareUnicodeCharacter{004A}{J}% |
|
\DeclareUnicodeCharacter{004B}{K}% |
|
\DeclareUnicodeCharacter{004C}{L}% |
|
\DeclareUnicodeCharacter{004D}{M}% |
|
\DeclareUnicodeCharacter{004E}{N}% |
|
\DeclareUnicodeCharacter{004F}{O}% |
|
\DeclareUnicodeCharacter{0050}{P}% |
|
\DeclareUnicodeCharacter{0051}{Q}% |
|
\DeclareUnicodeCharacter{0052}{R}% |
|
\DeclareUnicodeCharacter{0053}{S}% |
|
\DeclareUnicodeCharacter{0054}{T}% |
|
\DeclareUnicodeCharacter{0055}{U}% |
|
\DeclareUnicodeCharacter{0056}{V}% |
|
\DeclareUnicodeCharacter{0057}{W}% |
|
\DeclareUnicodeCharacter{0058}{X}% |
|
\DeclareUnicodeCharacter{0059}{Y}% |
|
\DeclareUnicodeCharacter{005A}{Z}% |
|
\DeclareUnicodeCharacter{005B}{\char"5B }% |
|
\DeclareUnicodeCharacter{005C}{\char"5C }% |
|
\DeclareUnicodeCharacter{005D}{\char"5D }% |
|
\DeclareUnicodeCharacter{005E}{\char"5E }% |
|
\DeclareUnicodeCharacter{005F}{\char"5F }% |
|
\DeclareUnicodeCharacter{0060}{\char"60 }% |
|
\DeclareUnicodeCharacter{0061}{a}% |
|
\DeclareUnicodeCharacter{0062}{b}% |
|
\DeclareUnicodeCharacter{0063}{c}% |
|
\DeclareUnicodeCharacter{0064}{d}% |
|
\DeclareUnicodeCharacter{0065}{e}% |
|
\DeclareUnicodeCharacter{0066}{f}% |
|
\DeclareUnicodeCharacter{0067}{g}% |
|
\DeclareUnicodeCharacter{0068}{h}% |
|
\DeclareUnicodeCharacter{0069}{i}% |
|
\DeclareUnicodeCharacter{006A}{j}% |
|
\DeclareUnicodeCharacter{006B}{k}% |
|
\DeclareUnicodeCharacter{006C}{l}% |
|
\DeclareUnicodeCharacter{006D}{m}% |
|
\DeclareUnicodeCharacter{006E}{n}% |
|
\DeclareUnicodeCharacter{006F}{o}% |
|
\DeclareUnicodeCharacter{0070}{p}% |
|
\DeclareUnicodeCharacter{0071}{q}% |
|
\DeclareUnicodeCharacter{0072}{r}% |
|
\DeclareUnicodeCharacter{0073}{s}% |
|
\DeclareUnicodeCharacter{0074}{t}% |
|
\DeclareUnicodeCharacter{0075}{u}% |
|
\DeclareUnicodeCharacter{0076}{v}% |
|
\DeclareUnicodeCharacter{0077}{w}% |
|
\DeclareUnicodeCharacter{0078}{x}% |
|
\DeclareUnicodeCharacter{0079}{y}% |
|
\DeclareUnicodeCharacter{007A}{z}% |
|
\DeclareUnicodeCharacter{007B}{\char"7B }% |
|
\DeclareUnicodeCharacter{007C}{\char"7C }% |
|
\DeclareUnicodeCharacter{007D}{\char"7D }% |
|
\DeclareUnicodeCharacter{007E}{\char"7E }% |
|
% \DeclareUnicodeCharacter{007F}{} % DEL |
|
% |
\DeclareUnicodeCharacter{00A0}{\tie}% |
\DeclareUnicodeCharacter{00A0}{\tie}% |
\DeclareUnicodeCharacter{00A1}{\exclamdown}% |
\DeclareUnicodeCharacter{00A1}{\exclamdown}% |
\DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent |
\DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent |
Line 10417 directory should work if nowhere else do
|
Line 10644 directory should work if nowhere else do
|
\DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% |
\DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% |
\DeclareUnicodeCharacter{00AF}{\={ }}% |
\DeclareUnicodeCharacter{00AF}{\={ }}% |
% |
% |
\DeclareUnicodeCharacter{00B0}{\ringaccent{ }}% |
\DeclareUnicodeCharacter{00B0}{\textdegree}% |
\DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% |
\DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% |
\DeclareUnicodeCharacter{00B2}{$^2$}% |
\DeclareUnicodeCharacter{00B2}{$^2$}% |
\DeclareUnicodeCharacter{00B3}{$^3$}% |
\DeclareUnicodeCharacter{00B3}{$^3$}% |
Line 10899 directory should work if nowhere else do
|
Line 11126 directory should work if nowhere else do
|
\DeclareUnicodeCharacter{1EF8}{\~Y}% |
\DeclareUnicodeCharacter{1EF8}{\~Y}% |
\DeclareUnicodeCharacter{1EF9}{\~y}% |
\DeclareUnicodeCharacter{1EF9}{\~y}% |
% |
% |
|
% Exotic spaces |
|
\DeclareUnicodeCharacter{2007}{\hphantom{0}}% |
|
% |
% Punctuation |
% Punctuation |
\DeclareUnicodeCharacter{2013}{--}% |
\DeclareUnicodeCharacter{2013}{--}% |
\DeclareUnicodeCharacter{2014}{---}% |
\DeclareUnicodeCharacter{2014}{---}% |
Line 10918 directory should work if nowhere else do
|
Line 11148 directory should work if nowhere else do
|
% |
% |
\DeclareUnicodeCharacter{20AC}{\euro{}}% |
\DeclareUnicodeCharacter{20AC}{\euro{}}% |
% |
% |
\DeclareUnicodeCharacter{2192}{\expansion{}}% |
\DeclareUnicodeCharacter{2192}{\arrow}% |
\DeclareUnicodeCharacter{21D2}{\result{}}% |
\DeclareUnicodeCharacter{21D2}{\result{}}% |
% |
% |
% Mathematical symbols |
% Mathematical symbols |
Line 11081 directory should work if nowhere else do
|
Line 11311 directory should work if nowhere else do
|
% provide a definition macro to replace/pass-through a Unicode character |
% provide a definition macro to replace/pass-through a Unicode character |
% |
% |
\def\DeclareUnicodeCharacterNative#1#2{% |
\def\DeclareUnicodeCharacterNative#1#2{% |
\catcode"#1=\active |
\ifnum"#1>"7F % only make non-ASCII chars active |
\def\dodeclareunicodecharacternative##1##2##3{% |
\catcode"#1=\active |
|
\def\dodeclareunicodecharacternative##1##2##3{% |
|
\begingroup |
|
\uccode`\~="##2\relax |
|
\uppercase{\gdef~}{% |
|
\ifpassthroughchars |
|
##1% |
|
\else |
|
##3% |
|
\fi |
|
} |
|
\endgroup |
|
} |
\begingroup |
\begingroup |
\uccode`\~="##2\relax |
\uccode`\.="#1\relax |
\uppercase{\gdef~}{% |
\uppercase{\def\UTFNativeTmp{.}}% |
\ifpassthroughchars |
\expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% |
##1% |
|
\else |
|
##3% |
|
\fi |
|
} |
|
\endgroup |
\endgroup |
} |
\fi |
\begingroup |
|
\uccode`\.="#1\relax |
|
\uppercase{\def\UTFNativeTmp{.}}% |
|
\expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% |
|
\endgroup |
|
} |
} |
|
|
% Native Unicode handling (XeTeX and LuaTeX) character replacing definition. |
% Native Unicode handling (XeTeX and LuaTeX) character replacing definition. |
Line 11127 directory should work if nowhere else do
|
Line 11359 directory should work if nowhere else do
|
\relax |
\relax |
} |
} |
|
|
% Define all Unicode characters we know about. This makes UTF-8 the default |
% Define all Unicode characters we know about |
% input encoding and allows @U to work. |
|
\iftxinativeunicodecapable |
\iftxinativeunicodecapable |
\nativeunicodechardefsatu |
\nativeunicodechardefsatu |
\else |
\else |
\utfeightchardefs |
\utfeightchardefs |
\fi |
\fi |
|
|
|
|
\message{formatting,} |
\message{formatting,} |
|
|
\newdimen\defaultparindent \defaultparindent = 15pt |
\newdimen\defaultparindent \defaultparindent = 15pt |
Line 11181 directory should work if nowhere else do
|
Line 11413 directory should work if nowhere else do
|
% |
% |
\vsize = #1\relax |
\vsize = #1\relax |
\advance\vsize by \topskip |
\advance\vsize by \topskip |
\outervsize = \vsize |
|
\advance\outervsize by 2\topandbottommargin |
|
\txipageheight = \vsize |
\txipageheight = \vsize |
% |
% |
\hsize = #2\relax |
\hsize = #2\relax |
\outerhsize = \hsize |
|
\advance\outerhsize by 0.5in |
|
\txipagewidth = \hsize |
\txipagewidth = \hsize |
% |
% |
\normaloffset = #4\relax |
\normaloffset = #4\relax |
Line 11244 directory should work if nowhere else do
|
Line 11472 directory should work if nowhere else do
|
\defbodyindent = .5cm |
\defbodyindent = .5cm |
}} |
}} |
|
|
% Use @smallerbook to reset parameters for 6x9 trim size. |
|
% (Just testing, parameters still in flux.) |
|
\def\smallerbook{{\globaldefs = 1 |
|
\parskip = 1.5pt plus 1pt |
|
\textleading = 12pt |
|
% |
|
\internalpagesizes{7.4in}{4.8in}% |
|
{-.2in}{-.4in}% |
|
{0pt}{14pt}% |
|
{9in}{6in}% |
|
% |
|
\lispnarrowing = 0.25in |
|
\tolerance = 700 |
|
\contentsrightmargin = 0pt |
|
\defbodyindent = .4cm |
|
}} |
|
|
|
% Use @afourpaper to print on European A4 paper. |
% Use @afourpaper to print on European A4 paper. |
\def\afourpaper{{\globaldefs = 1 |
\def\afourpaper{{\globaldefs = 1 |
\parskip = 3pt plus 2pt minus 1pt |
\parskip = 3pt plus 2pt minus 1pt |
Line 11294 directory should work if nowhere else do
|
Line 11505 directory should work if nowhere else do
|
\textleading = 12.5pt |
\textleading = 12.5pt |
% |
% |
\internalpagesizes{160mm}{120mm}% |
\internalpagesizes{160mm}{120mm}% |
{\voffset}{\hoffset}% |
{\voffset}{-11.4mm}% |
{\bindingoffset}{8pt}% |
{\bindingoffset}{8pt}% |
{210mm}{148mm}% |
{210mm}{148mm}% |
% |
% |
Line 11373 directory should work if nowhere else do
|
Line 11584 directory should work if nowhere else do
|
\hfuzz = 1pt |
\hfuzz = 1pt |
|
|
|
|
|
\message{microtype,} |
|
|
|
% protrusion, from Thanh's protcode.tex. |
|
\def\mtsetprotcode#1{% |
|
\rpcode#1`\!=200 \rpcode#1`\,=700 \rpcode#1`\-=700 \rpcode#1`\.=700 |
|
\rpcode#1`\;=500 \rpcode#1`\:=500 \rpcode#1`\?=200 |
|
\rpcode#1`\'=700 |
|
\rpcode#1 34=500 % '' |
|
\rpcode#1 123=300 % -- |
|
\rpcode#1 124=200 % --- |
|
\rpcode#1`\)=50 \rpcode#1`\A=50 \rpcode#1`\F=50 \rpcode#1`\K=50 |
|
\rpcode#1`\L=50 \rpcode#1`\T=50 \rpcode#1`\V=50 \rpcode#1`\W=50 |
|
\rpcode#1`\X=50 \rpcode#1`\Y=50 \rpcode#1`\k=50 \rpcode#1`\r=50 |
|
\rpcode#1`\t=50 \rpcode#1`\v=50 \rpcode#1`\w=50 \rpcode#1`\x=50 |
|
\rpcode#1`\y=50 |
|
% |
|
\lpcode#1`\`=700 |
|
\lpcode#1 92=500 % `` |
|
\lpcode#1`\(=50 \lpcode#1`\A=50 \lpcode#1`\J=50 \lpcode#1`\T=50 |
|
\lpcode#1`\V=50 \lpcode#1`\W=50 \lpcode#1`\X=50 \lpcode#1`\Y=50 |
|
\lpcode#1`\v=50 \lpcode#1`\w=50 \lpcode#1`\x=50 \lpcode#1`\y=0 |
|
% |
|
\mtadjustprotcode#1\relax |
|
} |
|
|
|
\newcount\countC |
|
\def\mtadjustprotcode#1{% |
|
\countC=0 |
|
\loop |
|
\ifcase\lpcode#1\countC\else |
|
\mtadjustcp\lpcode#1\countC |
|
\fi |
|
\ifcase\rpcode#1\countC\else |
|
\mtadjustcp\rpcode#1\countC |
|
\fi |
|
\advance\countC 1 |
|
\ifnum\countC < 256 \repeat |
|
} |
|
|
|
\newcount\countB |
|
\def\mtadjustcp#1#2#3{% |
|
\setbox\boxA=\hbox{% |
|
\ifx#2\font\else#2\fi |
|
\char#3}% |
|
\countB=\wd\boxA |
|
\multiply\countB #1#2#3\relax |
|
\divide\countB \fontdimen6 #2\relax |
|
#1#2#3=\countB\relax |
|
} |
|
|
|
\ifx\XeTeXrevision\thisisundefined |
|
\ifx\luatexversion\thisisundefined |
|
\ifpdf % pdfTeX |
|
\mtsetprotcode\textrm |
|
\def\mtfontexpand#1{\pdffontexpand#1 20 20 1 autoexpand\relax} |
|
\else % TeX |
|
\def\mtfontexpand#1{} |
|
\fi |
|
\else % LuaTeX |
|
\mtsetprotcode\textrm |
|
\def\mtfontexpand#1{\expandglyphsinfont#1 20 20 1\relax} |
|
\fi |
|
\else % XeTeX |
|
\mtsetprotcode\textrm |
|
\def\mtfontexpand#1{} |
|
\fi |
|
|
|
|
|
\newif\ifmicrotype |
|
|
|
\def\microtypeON{% |
|
\microtypetrue |
|
% |
|
\ifx\XeTeXrevision\thisisundefined |
|
\ifx\luatexversion\thisisundefined |
|
\ifpdf % pdfTeX |
|
\pdfadjustspacing=2 |
|
\pdfprotrudechars=2 |
|
\fi |
|
\else % LuaTeX |
|
\adjustspacing=2 |
|
\protrudechars=2 |
|
\fi |
|
\else % XeTeX |
|
\XeTeXprotrudechars=2 |
|
\fi |
|
% |
|
\mtfontexpand\textrm |
|
\mtfontexpand\textsl |
|
\mtfontexpand\textbf |
|
} |
|
|
|
\def\microtypeOFF{% |
|
\microtypefalse |
|
% |
|
\ifx\XeTeXrevision\thisisundefined |
|
\ifx\luatexversion\thisisundefined |
|
\ifpdf % pdfTeX |
|
\pdfadjustspacing=0 |
|
\pdfprotrudechars=0 |
|
\fi |
|
\else % LuaTeX |
|
\adjustspacing=0 |
|
\protrudechars=0 |
|
\fi |
|
\else % XeTeX |
|
\XeTeXprotrudechars=0 |
|
\fi |
|
} |
|
|
|
\microtypeOFF |
|
|
|
\parseargdef\microtype{% |
|
\def\txiarg{#1}% |
|
\ifx\txiarg\onword |
|
\microtypeON |
|
\else\ifx\txiarg\offword |
|
\microtypeOFF |
|
\else |
|
\errhelp = \EMsimple |
|
\errmessage{Unknown @microtype option `\txiarg', must be on|off}% |
|
\fi\fi |
|
} |
|
|
|
|
\message{and turning on texinfo input format.} |
\message{and turning on texinfo input format.} |
|
|
|
% Make UTF-8 the default encoding. |
|
\documentencodingzzz{UTF-8} |
|
|
\def^^L{\par} % remove \outer, so ^L can appear in an @comment |
\def^^L{\par} % remove \outer, so ^L can appear in an @comment |
|
\catcode`\^^K = 10 % treat vertical tab as whitespace |
|
|
% 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 |
Line 11391 directory should work if nowhere else do
|
Line 11731 directory should work if nowhere else do
|
\catcode`\|=\other \def\normalverticalbar{|} |
\catcode`\|=\other \def\normalverticalbar{|} |
\catcode`\~=\other \def\normaltilde{~} |
\catcode`\~=\other \def\normaltilde{~} |
|
|
% 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 something hairier probably needs to be done. |
|
% |
|
% #1 is what to print if we are indeed using \tt; #2 is what to print |
|
% otherwise. Since all the Computer Modern typewriter fonts have zero |
|
% interword stretch (and shrink), and it is reasonable to expect all |
|
% typewriter fonts to have this, we can check that font parameter. |
|
% |
|
\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} |
|
|
|
% Same as above, but check for italic font. Actually this also catches |
|
% non-italic slanted fonts since it is impossible to distinguish them from |
|
% italic fonts. But since this is only used by $ and it uses \sl anyway |
|
% this is not a problem. |
|
\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} |
|
|
|
% Set catcodes for Texinfo file |
% Set catcodes for Texinfo file |
|
|
% Active characters for printing the wanted glyph. |
% Active characters for printing the wanted glyph. |
Line 11453 directory should work if nowhere else do
|
Line 11776 directory should work if nowhere else do
|
% Used sometimes to turn off (effectively) the active characters even after |
% Used sometimes to turn off (effectively) the active characters even after |
% parsing them. |
% parsing them. |
\def\turnoffactive{% |
\def\turnoffactive{% |
\normalturnoffactive |
\passthroughcharstrue |
|
\let-=\normaldash |
|
\let"=\normaldoublequote |
|
\let$=\normaldollar %$ font-lock fix |
|
\let+=\normalplus |
|
\let<=\normalless |
|
\let>=\normalgreater |
|
\let^=\normalcaret |
|
\let_=\normalunderscore |
|
\let|=\normalverticalbar |
|
\let~=\normaltilde |
\otherbackslash |
\otherbackslash |
|
\setregularquotes |
|
\unsepspaces |
} |
} |
|
|
\catcode`\@=0 |
% If a .fmt file is being used, characters that might appear in a file |
|
% name cannot be active until we have parsed the command line. |
|
% So turn them off again, and have \loadconf turn them back on. |
|
\catcode`+=\other \catcode`\_=\other |
|
|
|
|
% \backslashcurfont outputs one backslash character in current font, |
% \backslashcurfont outputs one backslash character in current font, |
% as in \char`\\. |
% as in \char`\\. |
\global\chardef\backslashcurfont=`\\ |
\global\chardef\backslashcurfont=`\\ |
|
|
% \realbackslash is an actual character `\' with catcode other. |
|
{\catcode`\\=\other @gdef@realbackslash{\}} |
|
|
|
% In Texinfo, backslash is an active character; it prints the backslash |
|
% in fixed width font. |
|
\catcode`\\=\active % @ for escape char from now on. |
|
|
|
% Print a typewriter backslash. For math mode, we can't simply use |
% Print a typewriter backslash. For math mode, we can't simply use |
% \backslashcurfont: the story here is that in math mode, the \char |
% \backslashcurfont: the story here is that in math mode, the \char |
% of \backslashcurfont ends up printing the roman \ from the math symbol |
% of \backslashcurfont ends up printing the roman \ from the math symbol |
Line 11479 directory should work if nowhere else do
|
Line 11811 directory should work if nowhere else do
|
% ignored family value; char position "5C). We can't use " for the |
% ignored family value; char position "5C). We can't use " for the |
% usual hex value because it has already been made active. |
% usual hex value because it has already been made active. |
|
|
@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} |
\def\ttbackslash{{\tt \ifmmode \mathchar29020 \else \backslashcurfont \fi}} |
@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. |
\let\backslashchar = \ttbackslash % \backslashchar{} is for user documents. |
|
|
% \otherbackslash defines an active \ to be a literal `\' character with |
|
% catcode other. |
|
@gdef@otherbackslash{@let\=@realbackslash} |
|
|
|
% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of |
|
% the literal character `\'. |
|
% |
|
{@catcode`- = @active |
|
@gdef@normalturnoffactive{% |
|
@passthroughcharstrue |
|
@let-=@normaldash |
|
@let"=@normaldoublequote |
|
@let$=@normaldollar %$ font-lock fix |
|
@let+=@normalplus |
|
@let<=@normalless |
|
@let>=@normalgreater |
|
@let^=@normalcaret |
|
@let_=@normalunderscore |
|
@let|=@normalverticalbar |
|
@let~=@normaltilde |
|
@let\=@ttbackslash |
|
@setregularquotes |
|
@unsepspaces |
|
} |
|
} |
|
|
|
% If a .fmt file is being used, characters that might appear in a file |
|
% name cannot be active until we have parsed the command line. |
|
% So turn them off again, and have @fixbackslash turn them back on. |
|
@catcode`+=@other @catcode`@_=@other |
|
|
|
% \enablebackslashhack - allow file to begin `\input texinfo' |
% These are made active for url-breaking, so need |
% |
% active definitions as the normal characters. |
% If a .fmt file is being used, we don't want the `\input texinfo' to show up. |
\def\normaldot{.} |
% That is what \eatinput is for; after that, the `\' should revert to printing |
\def\normalquest{?} |
% a backslash. |
\def\normalslash{/} |
% If the file did not have a `\input texinfo', then it is turned off after |
|
% the first line; otherwise the first `\' in the file would cause an error. |
% \newlinesloadsconf - call \loadconf as soon as possible in the |
% This is used on the very last line of this file, texinfo.tex. |
% file, e.g. at the first newline. |
% We also use @c to call @fixbackslash, in case ends of lines are hidden. |
% |
{ |
{\catcode`\^=7 |
@catcode`@^=7 |
\catcode`\^^M=13 |
@catcode`@^^M=13@gdef@enablebackslashhack{% |
\gdef\newlineloadsconf{% |
@global@let\ = @eatinput% |
\catcode`\^^M=13 % |
@catcode`@^^M=13% |
\newlineloadsconfzz% |
@def@c{@fixbackslash@c}% |
} |
% Definition for the newline at the end of this file. |
\gdef\newlineloadsconfzz#1^^M{% |
@def ^^M{@let^^M@secondlinenl}% |
\def\c{\loadconf\c}% |
% Definition for a newline in the main Texinfo file. |
% Definition for the first newline read in the file |
@gdef @secondlinenl{@fixbackslash}% |
\def ^^M{\loadconf}% |
% In case the first line has a whole-line command on it |
% In case the first line has a whole-line or environment command on it |
@let@originalparsearg@parsearg |
\let\originalparsearg\parsearg% |
@def@parsearg{@fixbackslash@originalparsearg} |
\def\parsearg{\loadconf\originalparsearg}% |
|
% |
|
% \startenvironment is in the expansion of commands defined with \envdef |
|
\let\originalstartenvironment\startenvironment% |
|
\def\startenvironment{\loadconf\startenvironment}% |
}} |
}} |
|
|
{@catcode`@^=7 @catcode`@^^M=13% |
|
@gdef@eatinput input texinfo#1^^M{@fixbackslash}} |
|
|
|
% Emergency active definition of newline, in case an active newline token |
% Emergency active definition of newline, in case an active newline token |
% appears by mistake. |
% appears by mistake. |
{@catcode`@^=7 @catcode13=13% |
{\catcode`\^=7 \catcode13=13% |
@gdef@enableemergencynewline{% |
\gdef\enableemergencynewline{% |
@gdef^^M{% |
\gdef^^M{% |
@par% |
\par% |
%<warning: active newline>@par% |
%<warning: active newline>\par% |
}}} |
}}} |
|
|
|
|
@gdef@fixbackslash{% |
% \loadconf gets called at the beginning of every Texinfo file. |
@ifx\@eatinput @let\ = @ttbackslash @fi |
% If texinfo.cnf is present on the system, read it. Useful for site-wide |
@catcode13=5 % regular end of line |
% @afourpaper, etc. Not opening texinfo.cnf directly in texinfo.tex |
@enableemergencynewline |
% makes it possible to make a format file for Texinfo. |
@let@c=@comment |
% |
@let@parsearg@originalparsearg |
\gdef\loadconf{% |
|
\relax % Terminate the filename if running as "tex '&texinfo' FILE.texi". |
|
% |
|
% Turn off the definitions that trigger \loadconf |
|
\everyjobreset |
|
\catcode13=5 % regular end of line |
|
\enableemergencynewline |
|
\let\c=\comment |
|
\let\parsearg\originalparsearg |
|
\let\startenvironment\originalstartenvironment |
|
% |
% Also turn back on active characters that might appear in the input |
% Also turn back on active characters that might appear in the input |
% file name, in case not using a pre-dumped format. |
% file name, in case not using a pre-dumped format. |
@catcode`+=@active |
\catcode`+=\active |
@catcode`@_=@active |
\catcode`\_=\active |
% |
% |
% If texinfo.cnf is present on the system, read it. |
\openin 1 texinfo.cnf |
% Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets |
\ifeof 1 \else \input texinfo.cnf \fi |
% called at the beginning of every Texinfo file. Not opening texinfo.cnf |
\closein 1 |
% directly in this file, texinfo.tex, makes it possible to make a format |
|
% file for Texinfo. |
|
% |
|
@openin 1 texinfo.cnf |
|
@ifeof 1 @else @input texinfo.cnf @fi |
|
@closein 1 |
|
} |
} |
|
|
|
% Redefine some control sequences to be controlled by the \ifdummies |
|
% and \ifindexnofonts switches. Do this at the end so that the control |
|
% sequences are all defined. |
|
\definedummies |
|
|
|
|
|
|
|
|
|
\catcode`\@=0 |
|
|
|
% \realbackslash is an actual character `\' with catcode other. |
|
{\catcode`\\=\other @gdef@realbackslash{\}} |
|
|
|
% In Texinfo, backslash is an active character; it prints the backslash |
|
% in fixed width font. |
|
\catcode`\\=\active % @ for escape char from now on. |
|
|
|
@let\ = @ttbackslash |
|
|
|
% If in a .fmt file, print the version number. |
|
% \eatinput stops the `\input texinfo' from showing up. |
|
% After that, `\' should revert to printing a backslash. |
|
% Turn on active characters that we couldn't do earlier because |
|
% they might have appeared in the input file name. |
|
% |
|
@everyjob{@message{[Texinfo version @texinfoversion]}% |
|
@global@let\ = @eatinput |
|
@catcode`+=@active @catcode`@_=@active} |
|
|
|
{@catcode`@^=7 @catcode`@^^M=13% |
|
@gdef@eatinput input texinfo#1^^M{@loadconf}} |
|
|
|
@def@everyjobreset{@ifx\@eatinput @let\ = @ttbackslash @fi} |
|
|
|
% \otherbackslash defines an active \ to be a literal `\' character with |
|
% catcode other. |
|
@gdef@otherbackslash{@let\=@realbackslash} |
|
|
|
% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of |
|
% the literal character `\'. |
|
% |
|
{@catcode`- = @active |
|
@gdef@normalturnoffactive{% |
|
@turnoffactive |
|
@let\=@ttbackslash |
|
} |
|
} |
|
|
% 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. |
% @hashchar{} gets its own user-level command, because of #line. |
% @hashchar{} gets its own user-level command, because of #line. |
@catcode`@& = @other @def@normalamp{&} |
@catcode`@& = @other @def@normalamp{&} |
Line 11596 directory should work if nowhere else do
|
Line 11944 directory should work if nowhere else do
|
@c Do this last of all since we use ` in the previous @catcode assignments. |
@c Do this last of all since we use ` in the previous @catcode assignments. |
@catcode`@'=@active |
@catcode`@'=@active |
@catcode`@`=@active |
@catcode`@`=@active |
@setregularquotes |
|
|
|
@c Local variables: |
@c Local variables: |
@c eval: (add-hook 'before-save-hook 'time-stamp) |
@c eval: (add-hook 'before-save-hook 'time-stamp nil t) |
@c page-delimiter: "^\\\\message\\|emacs-page" |
@c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}" |
@c time-stamp-start: "def\\\\texinfoversion{" |
@c page-delimiter: "^\\\\message" |
@c time-stamp-format: "%:y-%02m-%02d.%02H" |
|
@c time-stamp-end: "}" |
|
@c End: |
@c End: |
|
|
@c vim:sw=2: |
@newlineloadsconf |
|
|
@enablebackslashhack |
|
|
|