--- freem/doc/texinfo.tex 2025/05/06 13:28:17 1.4 +++ freem/doc/texinfo.tex 2025/05/13 20:03:53 1.5 @@ -3,9 +3,9 @@ % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % -\def\texinfoversion{2024-02-10.22} +\def\texinfoversion{2020-02-11.09} % -% Copyright 1985, 1986, 1988, 1990-2024 Free Software Foundation, Inc. +% Copyright 1985, 1986, 1988, 1990-2019 Free Software Foundation, Inc. % % 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 @@ -33,7 +33,7 @@ % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % -% Send bug reports to bug-texinfo@gnu.org. Please include a +% Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % @@ -58,6 +58,12 @@ \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 % are identical in format to the corresponding ones from latex/pdflatex. \def\typeout{\immediate\write17}% @@ -235,6 +241,9 @@ % \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. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. @@ -275,7 +284,8 @@ % \topmark doesn't work for the very first chapter (after the title % 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., -% @setcolor (or @url etc.) between @contents and the very first @chapter. +% @setcolor (or @url, or @link, etc.) between @contents and the very +% first @chapter. \def\gettopheadingmarks{% \ifcase0\the\savedtopmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi @@ -307,8 +317,16 @@ \newbox\footlinebox % When outputting the double column layout for indices, an output routine -% is run several times, hiding the original value of \topmark. Hence, save -% \topmark at the beginning. +% is run several times, which hides the original value of \topmark. This +% can lead to a page heading being output and duplicating the chapter heading +% 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 \newif\iftopmarksaved @@ -331,13 +349,34 @@ \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % - \checkchapterpage + % Retrieve the information for the headings from the marks in the page, + % and call Plain TeX's \makeheadline and \makefootline, which use the + % values in \headline and \footline. + % + % This is used to check if we are on the first page of a chapter. + \ifcase1\the\savedtopmark\fi + \let\prevchaptername\thischaptername + \ifcase0\firstmark\fi + \let\curchaptername\thischaptername % - % Make the heading and footing. \makeheadline and \makefootline - % use the contents of \headline and \footline. - \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi + % + \ifx\curchaptername\prevchaptername + \let\thischapterheading\thischapter + \else + % \thischapterheading is the same as \thischapter except it is blank + % for the first page of a chapter. This is to prevent the chapter name + % being shown twice. + \def\thischapterheading{}% + \fi + % + % 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} + % \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% + % \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}% % @@ -384,22 +423,6 @@ \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } -% Check if we are on the first page of a chapter. Used for printing headings. -\newif\ifchapterpage -\def\checkchapterpage{% - % Get the chapter that was current at the end of the last page - \ifcase1\the\savedtopmark\fi - \let\prevchaptername\thischaptername - % - \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi - \let\curchaptername\thischaptername - % - \ifx\curchaptername\prevchaptername - \chapterpagefalse - \else - \chapterpagetrue - \fi -} % Argument parsing @@ -426,21 +449,42 @@ } % First remove any @comment, then any @c comment. Pass the result on to -% \argremovespace. +% \argcheckspaces. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} -\def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm} -% \argremovec might leave us with trailing space, though; e.g., +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurrence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., % @end itemize @c foo -% Note that the argument cannot contain the TeX $, as its catcode is -% changed to \other when Texinfo source is read. -\def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\ArgTerm} +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\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 % 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 -% just before passing the control to \next. -% (But first, we have to remove the remaining $ or two.) -\def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}} +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \argtorun. +% (Similarly, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% 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 @@ -502,7 +546,7 @@ % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} -\long\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% @@ -527,8 +571,9 @@ \fi } - -% @end foo calls \checkenv and executes the definition of \Efoo. +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else @@ -563,9 +608,6 @@ % @/ allows a line break. \let\/=\allowbreak -% @- allows explicit insertion of hyphenation points -\def\-{\discretionary{\normaldash}{}{}}% - % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} @@ -575,6 +617,21 @@ % @? is an end-of-sentence query. \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 % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. @@ -668,22 +725,32 @@ where each line of input produces a line \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 - % This is similar to the 'needspace' module in LaTeX. - % The first penalty allows a break if the end of the page is - % not too far away. Following penalties and skips are discarded. - % Otherwise, require at least \dimen0 of vertical space. - % - % (We used to use a \vtop to reserve space, but this had spacing issues - % when followed by a section heading, as it was not a "discardable item". - % This also has the benefit of providing glue before the page break if - % there isn't enough space.) - \vskip0pt plus \dimen0 - \penalty-100 - \vskip0pt plus -\dimen0 - \vskip \dimen0 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % 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 - \vskip -\dimen0 - \penalty0\relax % this hides the above glue from \safewhatsit and \dobreak + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak \fi } @@ -935,14 +1002,6 @@ where each line of input produces a line \global\everypar = {}% } -% leave vertical mode without cancelling any first paragraph indent -\gdef\imageindent{% - \toks0=\everypar - \everypar={}% - \ptexnoindent - \global\everypar=\toks0 -} - % @refill is a no-op. \let\refill=\relax @@ -951,7 +1010,7 @@ where each line of input produces a line \let\setfilename=\comment % @bye. -\outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend} +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} @@ -1078,53 +1137,6 @@ where each line of input produces a line \fi -% Output page labels information. -% See PDF reference v.1.7 p.594, section 8.3.1. -% Page label ranges must be increasing. -\ifpdf -\def\pagelabels{% - \def\title{0 << /P (T-) /S /D >>}% - % - % support @contents at very end of document - \ifnum\contentsendcount=\pagecount - \ifnum\arabiccount<\romancount - \pdfcatalog{/PageLabels << /Nums - [\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 - \let\pagelabels\relax -\fi - -\newcount\pagecount \pagecount=0 -\newcount\romancount \romancount=0 -\newcount\arabiccount \arabiccount=0 -\newcount\contentsendcount \contentsendcount=0 - -\ifpdf - \let\ptxadvancepageno\advancepageno - \def\advancepageno{% - \ptxadvancepageno\global\advance\pagecount by 1 - } -\fi - - % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be @@ -1180,17 +1192,13 @@ output) for that.)} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. - \def\curcolor{0 0 0}% \def\setcolor#1{% - \ifx#1\curcolor\else - \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% - \domark - \pdfsetcolor{#1}% - \xdef\curcolor{#1}% - \fi + \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% + \domark + \pdfsetcolor{#1}% } % - \let\maincolor\rgbBlack + \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} @@ -1346,7 +1354,7 @@ output) for that.)} % % by default, use black for everything. \def\urlcolor{\rgbBlack} - \let\linkcolor\rgbBlack + \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines @@ -1419,13 +1427,7 @@ output) for that.)} % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. - % - % Currently we prefix the section name with the section number - % for chapter and appendix headings only in order to avoid too much - % horizontal space being required in the PDF viewer. \def\numchapentry##1##2##3##4{% - \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}% - \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% @@ -1524,10 +1526,9 @@ output) for that.)} \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} - \def\pdflink#1{\pdflinkpage{#1}{#1}}% - \def\pdflinkpage#1#2{% + \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} - \setcolor{\linkcolor}#2\endlink} + \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode @@ -1668,13 +1669,9 @@ output) for that.)} % Therefore, we read toc only once. % % We use node names as destinations. - % - % Currently we prefix the section name with the section number - % for chapter and appendix headings only in order to avoid too much - % horizontal space being required in the PDF viewer. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% - \dopdfoutline{##2 ##1}{1}{##3}{##4}}% + \dopdfoutline{##1}{1}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{2}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% @@ -1686,8 +1683,7 @@ output) for that.)} \let\appsecentry\numsecentry% \let\appsubsecentry\numsubsecentry% \let\appsubsubsecentry\numsubsubsecentry% - \def\unnchapentry##1##2##3##4{% - \dopdfoutline{##1}{1}{##3}{##4}}% + \let\unnchapentry\numchapentry% \let\unnsecentry\numsecentry% \let\unnsubsecentry\numsubsecentry% \let\unnsubsubsecentry\numsubsubsecentry% @@ -1774,11 +1770,10 @@ output) for that.)} \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} - \def\pdflink#1{\pdflinkpage{#1}{#1}}% - \def\pdflinkpage#1#2{% + \def\pdflink#1{% \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% - \setcolor{\linkcolor}#2\endlink} + \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} % % @@ -1817,23 +1812,19 @@ output) for that.)} \closein 1 \endgroup % - % Putting an \hbox around the image can prevent an over-long line - % after the image. - \hbox\bgroup - \def\xetexpdfext{pdf}% + \def\xetexpdfext{pdf}% + \ifx\xeteximgext\xetexpdfext + \XeTeXpdffile "#1".\xeteximgext "" + \else + \def\xetexpdfext{PDF}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else - \def\xetexpdfext{PDF}% - \ifx\xeteximgext\xetexpdfext - \XeTeXpdffile "#1".\xeteximgext "" - \else - \XeTeXpicfile "#1".\xeteximgext "" - \fi + \XeTeXpicfile "#1".\xeteximgext "" \fi - \ifdim \wd0 >0pt width \xeteximagewidth \fi - \ifdim \wd2 >0pt height \xeteximageheight \fi \relax - \egroup + \fi + \ifdim \wd0 >0pt width \xeteximagewidth \fi + \ifdim \wd2 >0pt height \xeteximageheight \fi \relax } \fi @@ -2123,11 +2114,6 @@ end \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \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. @@ -2143,10 +2129,11 @@ end \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \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. % To specify the font prefix, you must define \fontprefix @@ -2537,30 +2524,34 @@ end \scriptfont\sffam=\sevensf } +% - -% \defineassignfonts{SIZE} - -% Define sequence \assignfontsSIZE, which switches between font sizes -% by redefining the meanings of \STYLEfont. (Just \STYLE additionally sets -% the current \fam for math mode.) -% -\def\defineassignfonts#1{% - \expandafter\edef\csname assignfonts#1\endcsname{% - \let\noexpand\rmfont\csname #1rm\endcsname - \let\noexpand\itfont\csname #1it\endcsname - \let\noexpand\slfont\csname #1sl\endcsname - \let\noexpand\bffont\csname #1bf\endcsname - \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 - } -} +% The font-changing commands (all called \...fonts) redefine the meanings +% of \STYLEfont, instead of just \STYLE. We do this because \STYLE needs +% to also set the current \fam for math mode. Our \STYLE (e.g., \rm) +% commands hardwire \STYLEfont to set the current font. +% +% The fonts used for \ifont are for "math italics" (\itfont is for italics +% in regular text). \syfont is also used in math mode only. +% +% 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. +% +% This all needs generalizing, badly. +% \def\assignfonts#1{% - \csname assignfonts#1\endcsname + \expandafter\let\expandafter\rmfont\csname #1rm\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 @@ -2584,21 +2575,12 @@ end \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{% - \defineassignfonts{#1}% \expandafter\def\csname #1fonts\endcsname{% \def\curfontsize{#1}% \def\lsize{#2}\def\lllsize{#3}% \csname rmisbold#5\endcsname - \csname assignfonts#1\endcsname + \assignfonts{#1}% \resetmathfonts \setleading{#4}% }} @@ -2640,60 +2622,111 @@ end \definetextfontsizexi +\message{markup,} + % Check if we are currently using a typewriter font. 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 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\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } -% 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} +% Markup style infrastructure. \defmarkupstylesetup\INITMACRO will +% define and register \INITMACRO to be called on markup style changes. +% \INITMACRO can check \currentmarkupstyle for the innermost +% style. +\let\currentmarkupstyle\empty -% 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 +\def\setupmarkupstyle#1{% + \def\currentmarkupstyle{#1}% + \markupstylesetup +} + +\let\markupstylesetup\empty + +\def\defmarkupstylesetup#1{% + \expandafter\def\expandafter\markupstylesetup + \expandafter{\markupstylesetup #1}% + \def#1% +} + +% Markup style setup for left and right quotes. +\defmarkupstylesetup\markupsetuplq{% + \expandafter\let\expandafter \temp + \csname markupsetuplq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuplqdefault \else \temp \fi +} + +\defmarkupstylesetup\markupsetuprq{% + \expandafter\let\expandafter \temp + \csname markupsetuprq\currentmarkupstyle\endcsname + \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active -\gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} -\gdef\setregularquotes{\let`\lq \let'\rq} +\gdef\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} } -\setregularquotes -% output for ' in @code -% in tt font hex 0D (undirected) or 27 (curly right quote) +\let\markupsetuplqcode \markupsetcodequoteleft +\let\markupsetuprqcode \markupsetcodequoteright +% +\let\markupsetuplqexample \markupsetcodequoteleft +\let\markupsetuprqexample \markupsetcodequoteright +% +\let\markupsetuplqkbd \markupsetcodequoteleft +\let\markupsetuprqkbd \markupsetcodequoteright +% +\let\markupsetuplqsamp \markupsetcodequoteleft +\let\markupsetuprqsamp \markupsetcodequoteright +% +\let\markupsetuplqverb \markupsetcodequoteleft +\let\markupsetuprqverb \markupsetcodequoteright +% +\let\markupsetuplqverbatim \markupsetcodequoteleft +\let\markupsetuprqverbatim \markupsetcodequoteright + +% Allow an option to not use regular directed right quote/apostrophe +% (char 0x27), but instead the undirected quote from cmtt (char 0x0d). +% 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{% - \ifusingtt - {\ifflagclear{txicodequoteundirected}% - {\ifflagclear{codequoteundirected}% - {'}% - {\char"0D }}% - {\char"0D }}% - {'}% + \ifmonospace + \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax + \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax + '% + \else \char'15 \fi + \else \char'15 \fi + \else + '% + \fi } - -% output for ` in @code -% in tt font hex 12 (grave accent) or 60 (curly left quote) -% \relax disables Spanish ligatures ?` and !` of \tt font. +% +% and a similar option for the left quote char vs. a grave accent. +% Modern fonts display ASCII 0x60 as a grave accent, so some people like +% the code environments to do likewise. % \def\codequoteleft{% - \ifusingtt - {\ifflagclear{txicodequotebacktick}% - {\ifflagclear{codequotebacktick}% - {\relax`}% - {\char"12 }}% - {\char"12 }}% - {\relax`}% + \ifmonospace + \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax + \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax + % [Knuth] pp. 380,381,391 + % \relax disables Spanish ligatures ?` and !` of \tt font. + \relax`% + \else \char'22 \fi + \else \char'22 \fi + \else + \relax`% + \fi } % Commands to set the quote options. @@ -2711,7 +2744,7 @@ end \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } - +% \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword @@ -2726,11 +2759,6 @@ end \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. \def\noligaturesquoteleft{\relax\lq} @@ -2745,16 +2773,15 @@ end \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% - {\def\next{{#1#2}\smartitaliccorrection}}% + {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} -% Output an italic correction unless the following character is such as -% not to need one. -\def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx} -\def\smartitaliccorrectionx{% +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% @@ -2765,41 +2792,27 @@ end \aftersmartic } -% @cite unconditionally uses \sl with \smartitaliccorrection. -\def\cite#1{{\sl #1}\smartitaliccorrection} +% Unconditional use \ttsl, and no ic. @var is set to this for defuns. +\def\ttslanted#1{{\ttsl #1}} + +% @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\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% - % - \ifflagclear{txicodevaristt}% - {\def\varnext{{{\sl #1}}\smartitaliccorrection}}% - {\def\varnext{\smartslanted{#1}}}% - \varnext + \smartslanted{#1}% } -% To be removed after next release -\def\SETtxicodevaristt{}% @set txicodevaristt - \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic -% @r for roman font, used for code comment -\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. +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font @@ -2810,8 +2823,12 @@ end % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} -\newif\iffrenchspacing -\frenchspacingfalse +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% 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. % Can't use plain's \frenchspacing because it uses the `\x notation, and @@ -2819,50 +2836,26 @@ end % \catcode`@=11 \def\plainfrenchspacing{% - \iffrenchspacing\else - \frenchspacingtrue - \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m - \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m - \def\endofsentencespacefactor{1000}% for @. and friends - \fi + \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m + \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m + \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% - \iffrenchspacing - \frenchspacingfalse - \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 - \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 - \def\endofsentencespacefactor{3000}% for @. and friends - \fi + \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 + \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \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. \def\t#1{% - {\tt \defcharsdefault \plainfrenchspacing #1}% + {\tt \plainfrenchspacing #1}% \null } % @samp. -\def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}} +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp @@ -2878,44 +2871,47 @@ end % Switch to typewriter. \tt % - % `\ ' produces the large typewriter interword space. + % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % + % Turn off hyphenation. + \nohyphenation + % \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } -% This is for LuaTeX: It is not sufficient to disable hyphenation at -% explicit dashes by setting `\hyphenchar` to -1. -\def\dashnobreak{% - \normaldash - \penalty 10000 } - -% We must turn on hyphenation at `-' and `_' in @code. +% We *must* turn on hyphenation at `-' and `_' in @code. +% (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. -% We explicitly allow hyphenation at these characters -% using \discretionary. % -% Hyphenation at - and hyphenation within words was turned off -% by default for the tt fonts using the \hyphenchar parameter of TeX. +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% 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 \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup - \setcodequotes + \setupmarkupstyle{code}% + % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else - \let-\dashnobreak + \let-\normaldash \let_\realunder \fi + % Given -foo (with a single dash), we do not want to allow a break + % after the hyphen. + \global\let\codedashprev=\codedash + % \codex } % @@ -2925,30 +2921,21 @@ end % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or - % (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. - % + % (b) the preceding character is a -. % 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. \ifx\next\codedash \else - \ifx\codedashnobreak\codedash + \ifx\codedashprev\codedash \else \discretionary{}{}{}\fi \fi % 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}. - \global\let\codedashnobreak= \next + \global\let\codedashprev= \next } } \def\normaldash{-} % -\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\codex #1{\tclose{#1}\endgroup} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ @@ -3000,18 +2987,10 @@ end % arg (if given), and not the url (which is then just the link target). \newif\ifurefurlonlylink -% The default \pretolerance setting stops the penalty inserted in -% \urefallowbreak being a discouragement to line breaking. Set it to -% a negative value for this paragraph only. Hopefully this does not -% conflict with redefinitions of \par done elsewhere. -\def\nopretolerance{% -\pretolerance=-1 -\def\par{\endgraf\pretolerance=100 \let\par\endgraf}% -} - % The main macro is \urefbreak, which allows breaking at expected -% places within the url. -\def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak} +% places within the url. (There used to be another version, which +% didn't support automatic breaking.) +\def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak % \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} @@ -3066,7 +3045,7 @@ end \urefcatcodes % \global\def\urefcode{\begingroup - \setcodequotes + \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot @@ -3122,14 +3101,14 @@ end % Allow a ragged right output to aid breaking long URL's. There can % be a break at the \allowbreak with no extra glue (if the existing stretch in -% the line is sufficient), a break at the \penalty with extra glue added +% the line is sufficent), a break at the \penalty100 with extra glue added % at the end of the line, or no break at all here. % Changing the value of the penalty and/or the amount of stretch affects how -% preferable one choice is over the other. +% preferrable one choice is over the other. \def\urefallowbreak{% - \penalty0\relax + \allowbreak \hskip 0pt plus 2 em\relax - \penalty1000\relax + \penalty300 \hskip 0pt plus -2 em\relax } @@ -3179,8 +3158,16 @@ end % Default is `distinct'. \kbdinputstyle distinct -\def\kbd#1{% - \tclose{\kbdfont\setcodequotes#1}% +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. +\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\setupmarkupstyle{kbd}\look}}\fi + \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. @@ -3193,9 +3180,14 @@ end % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} -% definition of @key with no lozenge. -% -\def\key#1{{\setregularquotes \tt #1}\null} +% definition of @key with no lozenge. If the current font is already +% monospace, don't change it; that way, we respect @kbdinputstyle. But +% if it isn't monospace, then use \tt. +% +\def\key#1{{\setupmarkupstyle{key}% + \nohyphenation + \ifmonospace\else\tt\fi + #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} @@ -3313,29 +3305,6 @@ end \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}% -% provide this command from LaTeX as it is very common -\def\frac#1#2{{{#1}\over{#2}}} - -% @displaymath. -% \globaldefs is needed to recognize the end lines in \tex and -% \end tex. Set \thisenv as @end displaymath is seen before @end tex. -{\obeylines -\globaldefs=1 -\envdef\displaymath{% -\tex% -\def\thisenv{\displaymath}% -\begingroup\let\end\displaymathend% -$$% -} - -\def\displaymathend{$$\endgroup\end}% - -\def\Edisplaymath{% -\def\thisenv{\tex}% -\end tex -}} - - % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. @@ -3398,8 +3367,8 @@ $$% \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. -\def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}} -\def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}} +\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}} +\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}} \let\{=\lbracechar \let\}=\rbracechar @@ -3453,13 +3422,8 @@ $$% % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else - \ifx\curfontsize\smallword - % For footnotes and indices - \count255=\the\fam $\fam\count255 \scriptstyle A$% - \else - % For 11pt, we can use our lllsize. - \switchtolllsize A% - \fi + % For 11pt, we can use our lllsize. + \switchtolllsize A% \fi }% \vss @@ -3467,7 +3431,6 @@ $$% \kern-.15em \TeX } -\def\smallword{small} % Some math mode symbols. Define \ensuremath to switch into math mode % unless we are already there. Expansion tricks may not be needed here, @@ -3546,7 +3509,7 @@ $$% % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % -\def\pounds{{\ifusingtt{\ecfont\char"BF}{\it\$}}} +\def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik @@ -3615,9 +3578,6 @@ $$% \def\quotedblbase{{\ecfont \char"12}} \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 % 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 @@ -3660,17 +3620,18 @@ $$% % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% - \ifusingtt - % typewriter: - {\font\thisecfont = #1ctt\ecsize \space at \nominalsize}% - % else - {\ifx\curfontstyle\bfstylename - % bold: - \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize - \else - % regular: - \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize - \fi}% + \ifmonospace + % typewriter: + \font\thisecfont = #1ctt\ecsize \space at \nominalsize + \else + \ifx\curfontstyle\bfstylename + % bold: + \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize + \else + % regular: + \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize + \fi + \fi \thisecfont } @@ -3686,10 +3647,7 @@ $$% % @textdegree - the normal degrees sign. % -\def\textdegree{% - \ifmmode ^\circ - \else {\tcfont \char 176}% - \fi} +\def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 @@ -3700,19 +3658,11 @@ $$% \fi % Quotes. +\chardef\quotedblleft="5C +\chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' -% only change font for tt for correct kerning and to avoid using -% \ecfont unless necessary. -\def\quotedblleft{% - \ifusingtt{{\ecfont\char"10}}{{\char"5C}}% -} - -\def\quotedblright{% - \ifusingtt{{\ecfont\char"11}}{{\char`\"}}% -} - \message{page headings,} @@ -3735,14 +3685,13 @@ $$% want the contents after the title page.}}% \parseargdef\shorttitlepage{% - {\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% - \endgroup\page\hbox{}\page}\pageone} + \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts - \headingsoff % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. @@ -3770,9 +3719,11 @@ $$% % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage - \pageone \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{% @@ -3833,22 +3784,14 @@ $$% \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages -\newtoks\evenchapheadline% headline on even pages with a new chapter -\newtoks\oddchapheadline % headline on odd pages with a new chapter \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make \makeheadline and \makefootline in Plain TeX use those variables -\headline={{\textfonts\rm\frenchspacingsetting - \ifchapterpage - \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi - \else - \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi - \fi}} - -\footline={{\textfonts\rm\frenchspacingsetting - \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}% - \HEADINGShook} +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. @@ -3862,14 +3805,12 @@ $$% \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% - \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} - \global\evenchapheadline=\evenheadline} +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% - \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}% - \global\oddchapheadline=\oddheadline} +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% @@ -3936,59 +3877,56 @@ $$% \parseargdef\headings{\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination - \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}% - \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}% + \evenheadline={\hfil}\evenfootline={\hfil}% + \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting +\HEADINGSoff % it's the default -% Set the page number to 1. -\def\pageone{ - \global\pageno=1 - \global\arabiccount = \pagecount -} - -\let\contentsalignmacro = \chappager - -% \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon - +% When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. -\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble} -\let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdouble{% +\global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\evenchapheadline={\line{\folio\hfil\thistitle}} -\global\oddchapheadline={\line{\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } +\let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. -\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle} \def\HEADINGSsingle{% +\global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\evenchapheadline={\line{\hfil\folio}} -\global\oddchapheadline={\line{\hfil\folio}} +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chappager } +\def\HEADINGSon{\HEADINGSdouble} -% for @setchapternewpage off -\def\HEADINGSsinglechapoff{% +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} -\global\evenchapheadline=\evenheadline -\global\oddchapheadline=\oddheadline +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}} \global\let\contentsalignmacro = \chappager } @@ -4297,8 +4235,82 @@ $$% \doitemize{#1.}\flushcr } +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + % @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt % Macros used to set up halign preamble: % @@ -4346,13 +4358,16 @@ $$% \go } +% multitable-only commands. +% % @headitem starts a heading row, which we typeset in bold. Assignments % have to be global since we are inside the implicit group of an % alignment entry. \everycr below resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% - \crcr % must appear first + \checkenv\multitable + \crcr \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item @@ -4361,8 +4376,14 @@ $$% % default for tables with no headings. \let\headitemcrhook=\relax % +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we again encounter the problem the 1sp was intended to solve. +% --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% +% @multitable ... @end multitable definitions: +% \newtoks\everytab % insert after every tab. % \envdef\multitable{% @@ -4377,8 +4398,9 @@ $$% % \tolerance=9500 \hbadness=9500 - \parskip=0pt - \parindent=6pt + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % @@ -4408,24 +4430,47 @@ $$% % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 - \strut + \multistrut \vtop{% - \advance\hsize by -1\leftskip - % Find the correct column width + % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % - \advance\rightskip by -1\rightskip % Zero leaving only any stretch + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt \ifnum\colcount=1 - \advance\hsize by\leftskip % Add indent of surrounding text + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip \else - % In order to keep entries from bumping into each other. - \leftskip=12pt - \ifsetpercent \else - % If a template has been used - \advance\hsize by \leftskip - \fi + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace \fi - \noindent\ignorespaces##\unskip\strut + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% @@ -4434,10 +4479,35 @@ $$% \global\setpercentfalse } +\def\setmultitablespacing{% + \def\multistrut{\strut}% just use the standard line spacing + % + % Compute \multitablelinespace (if not defined by user) for use in + % \multitableparskip calculation. We used define \multistrut based on + % this, but (ironically) that caused the spacing to be off. + % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +\fi +% Test to see if parskip is larger than space between lines of +% table. If not, do nothing. +% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller + % than skip between lines in the table. +\fi} + \message{conditionals,} -% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @ifnotplaintext, +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't @@ -4451,7 +4521,6 @@ $$% \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} -\makecond{ifnotlatex} \makecond{ifnotplaintext} \makecond{ifnotxml} @@ -4464,12 +4533,10 @@ $$% \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} -\def\iflatex{\doignore{iflatex}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} -\def\latex{\doignore{latex}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} @@ -4708,11 +4775,13 @@ $$% % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} -% \newindex {IX} defines an index named IX. +% \newindex {foo} defines an index named IX. % It automatically defines \IXindex such that % \IXindex ...rest of line... puts an entry in the index IX. % 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 name of an index should be no more than 2 characters long +% for the sake of vms. % \def\newindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 @@ -4772,8 +4841,23 @@ $$% % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} -\def\docodeindexxxx #1{\docind{\indexname}{#1}} +\def\docodeindexxxx #1{\doind{\indexname}{\code{#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 % preventing its expansion. This is used only for control words, @@ -4790,91 +4874,110 @@ $$% % \def\definedummyword #1{\def#1{\string#1\space}}% \def\definedummyletter#1{\def#1{\string#1}}% +\let\definedummyaccent\definedummyletter -% Used for the aux, toc and index files to prevent expansion of Texinfo -% commands. Most of the commands are controlled through the -% \ifdummies conditional. +% Called from \atdummies to prevent the expansion of commands. % -\def\atdummies{% - \dummiestrue +\def\definedummies{% % - \definedummyletter\@% - \definedummyletter\ % - \definedummyletter\{% - \definedummyletter\}% - \definedummyletter\&% + \let\commondummyword\definedummyword + \let\commondummyletter\definedummyletter + \let\commondummyaccent\definedummyaccent + \commondummiesnofonts % \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 % % We want to disable all macros so that they are not expanded by \write. - \let\commondummyword\definedummyword \macrolist \let\value\dummyvalue % - \turnoffactive + \normalturnoffactive } -\newif\ifdummies -\newif\ifindexnofonts - -\def\commondummyletter#1{% - \expandafter\let\csname\string#1:impl\endcsname#1% - \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 = `\@ - % +% \commondummiesnofonts: common to \definedummies and \indexnofonts. +% Define \commondummyletter, \commondummyaccent and \commondummyword before +% using. Used for accents, font commands, and various control letters. +% +\def\commondummiesnofonts{% + % Control letters and accents. \commondummyletter\!% \commondummyaccent\"% \commondummyaccent\'% @@ -4888,124 +4991,58 @@ $$% \commondummyaccent\^% \commondummyaccent\`% \commondummyaccent\~% - % - % Control letters and accents. - \commondummyword\u {}% - \commondummyword\v {}% - \commondummyword\H {}% - \commondummyword\dotaccent {}% - \commondummyword\ogonek {}% - \commondummyword\ringaccent {}% - \commondummyword\tieaccent {}% - \commondummyword\ubaraccent {}% - \commondummyword\udotaccent {}% - \commondummyword\dotless {}% + \commondummyword\u + \commondummyword\v + \commondummyword\H + \commondummyword\dotaccent + \commondummyword\ogonek + \commondummyword\ringaccent + \commondummyword\tieaccent + \commondummyword\ubaraccent + \commondummyword\udotaccent + \commondummyword\dotless % % Texinfo font commands. - \commondummyword\b {}% - \commondummyword\i {}% - \commondummyword\r {}% - \commondummyword\sansserif {}% - \commondummyword\sc {}% - \commondummyword\slanted {}% - \commondummyword\t {}% + \commondummyword\b + \commondummyword\i + \commondummyword\r + \commondummyword\sansserif + \commondummyword\sc + \commondummyword\slanted + \commondummyword\t % % Commands that take arguments. - \commondummyword\abbr {}% - \commondummyword\acronym {}% - \commondummyword\anchor {}% - \commondummyword\cite {}% - \commondummyword\code {}% - \commondummyword\command {}% - \commondummyword\dfn {}% - \commondummyword\dmn {}% - \commondummyword\email {}% - \commondummyword\emph {}% - \commondummyword\env {}% - \commondummyword\file {}% - \commondummyword\image {}% - \commondummyword\indicateurl{}% - \commondummyword\inforef {}% - \commondummyword\kbd {}% - \commondummyword\key {}% - \commondummyword\link {}% - \commondummyword\math {}% - \commondummyword\option {}% - \commondummyword\pxref {}% - \commondummyword\ref {}% - \commondummyword\samp {}% - \commondummyword\strong {}% - \commondummyword\tie {}% - \commondummyword\U {}% - \commondummyword\uref {}% - \commondummyword\url {}% - \commondummyword\var {}% - \commondummyword\verb {}% - \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}% + \commondummyword\abbr + \commondummyword\acronym + \commondummyword\anchor + \commondummyword\cite + \commondummyword\code + \commondummyword\command + \commondummyword\dfn + \commondummyword\dmn + \commondummyword\email + \commondummyword\emph + \commondummyword\env + \commondummyword\file + \commondummyword\image + \commondummyword\indicateurl + \commondummyword\inforef + \commondummyword\kbd + \commondummyword\key + \commondummyword\math + \commondummyword\option + \commondummyword\pxref + \commondummyword\ref + \commondummyword\samp + \commondummyword\strong + \commondummyword\tie + \commondummyword\U + \commondummyword\uref + \commondummyword\url + \commondummyword\var + \commondummyword\verb + \commondummyword\w + \commondummyword\xref } \let\indexlbrace\relax @@ -5023,24 +5060,25 @@ $$% \catcode`\-=13 \catcode`\`=13 \gdef\indexnonalnumdisappear{% - \ifflagclear{txiindexlquoteignore}{}{% + \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else % @set txiindexlquoteignore makes us ignore left quotes in the sort term. % (Introduced for FSFS 2nd ed.) \let`=\empty - }% + \fi % - \ifflagclear{txiindexbackslashignore}{}{% + \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else \backslashdisappear - }% - \ifflagclear{txiindexhyphenignore}{}{% + \fi + % + \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else \def-{}% - }% - \ifflagclear{txiindexlessthanignore}{}{% + \fi + \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else \def<{}% - }% - \ifflagclear{txiindexatsignignore}{}{% + \fi + \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else \def\@{}% - }% + \fi } \gdef\indexnonalnumreappear{% @@ -5056,7 +5094,18 @@ $$% % would be for a given command (usually its argument). % \def\indexnofonts{% - \indexnofontstrue + % Accent commands should become @asis. + \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\@{@}% @@ -5068,18 +5117,79 @@ $$% \let\lbracechar\{% \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}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. \defglyph gives the control sequence a + % definition that removes the {} that follows its use. + \defglyph\atchar{@}% + \defglyph\arrow{->}% + \defglyph\bullet{bullet}% + \defglyph\comma{,}% + \defglyph\copyright{copyright}% + \defglyph\dots{...}% + \defglyph\enddots{...}% + \defglyph\equiv{==}% + \defglyph\error{error}% + \defglyph\euro{euro}% + \defglyph\expansion{==>}% + \defglyph\geq{>=}% + \defglyph\guillemetleft{<<}% + \defglyph\guillemetright{>>}% + \defglyph\guilsinglleft{<}% + \defglyph\guilsinglright{>}% + \defglyph\leq{<=}% + \defglyph\lbracechar{\{}% + \defglyph\minus{-}% + \defglyph\point{.}% + \defglyph\pounds{pounds}% + \defglyph\print{-|}% + \defglyph\quotedblbase{"}% + \defglyph\quotedblleft{"}% + \defglyph\quotedblright{"}% + \defglyph\quoteleft{`}% + \defglyph\quoteright{'}% + \defglyph\quotesinglbase{,}% + \defglyph\rbracechar{\}}% + \defglyph\registeredsymbol{R}% + \defglyph\result{=>}% + \defglyph\textdegree{o}% % % 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. + % 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 % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % - \def\commondummyword##1{\let##1\asis}% \macrolist \let\value\indexnofontsvalue } +\def\defglyph#1#2{\def#1##1{#2}} % see above @@ -5098,20 +5208,6 @@ $$% \fi } -% Same as \doind, but for code indices -\def\docind#1#2{% - \iflinks - {% - % - \requireopenindexfile{#1}% - \edef\writeto{\csname#1indfile\endcsname}% - % - \def\indextext{#2}% - \safewhatsit\docindwrite - }% - \fi -} - % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 @@ -5178,9 +5274,6 @@ $$% % trim spaces. \edef\trimmed{\segment}% \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% - \ifincodeindex - \edef\trimmed{\noexpand\code{\trimmed}}% - \fi % \xdef\bracedtext{\bracedtext{\trimmed}}% % @@ -5211,10 +5304,7 @@ $$% \xdef\trimmed{\segment}% \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \xdef\indexsortkey{\trimmed}% - \ifx\indexsortkey\empty - \message{Empty index sort key near line \the\inputlineno}% - \xdef\indexsortkey{ }% - \fi + \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi }\fi % % Append to \fullindexsortkey. @@ -5238,28 +5328,25 @@ $$% % the current value of \escapechar. \def\escapeisbackslash{\escapechar=`\\} -% Uncomment to use \ in index files by default. Old texi2dvi (before 2019) -% didn't support @ as the escape character (as it checked for "\entry" in -% the files, and not "@entry"). -% In the future we can remove this flag and simplify the code for -% index files and backslashes, once the support is no longer likely to be -% useful. +% Use \ in index files by default. texi2dvi didn't support @ as the escape +% character (as it checked for "\entry" in the files, and not "@entry"). When +% the new version of texi2dvi has had a chance to become more prevalent, then +% the escape character can change back to @ again. This should be an easy +% change to make now because both @ and \ are only used as escape characters in +% index files, never standing for themselves. % -% \set txiindexescapeisbackslash +\set txiindexescapeisbackslash % Write the entry in \indextext to the index file. % - -\newif\ifincodeindex -\def\doindwrite{\incodeindexfalse\doindwritex} -\def\docindwrite{\incodeindextrue\doindwritex} - -\def\doindwritex{% +\def\doindwrite{% \maybemarginindex % \atdummies % - \ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}% + \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax\else + \escapeisbackslash + \fi % % For texindex which always views { and } as separators. \def\{{\lbracechar{}}% @@ -5443,9 +5530,9 @@ $$% % old index files using \ as the escape character. Reading this would % at best lead to typesetting garbage, at worst a TeX syntax error. \def\printindexzz#1#2\finish{% - \ifflagclear{txiindexescapeisbackslash}{% + \expandafter\ifx\csname SETtxiindexescapeisbackslash\endcsname\relax \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 - \ifflagclear{txiskipindexfileswithbackslash}{% + \expandafter\ifx\csname SETtxiskipindexfileswithbackslash\endcsname\relax \errmessage{% ERROR: A sorted index file in an obsolete format was skipped. To fix this problem, please upgrade your version of 'texi2dvi' @@ -5461,25 +5548,21 @@ this, Texinfo will try to use index file If you continue to have problems, deleting the index files and starting again might help (with 'rm \jobname.?? \jobname.??s')% }% - }{% + \else (Skipped sorted index file in obsolete format) - }% + \fi \else \begindoublecolumns \input \jobname.\indexname s \enddoublecolumns \fi - }{% + \else \begindoublecolumns \catcode`\\=0\relax - % - % Make @ an escape character to give macros a chance to work. This - % should work because we (hopefully) don't otherwise use @ in index files. - %\catcode`\@=12\relax - \catcode`\@=0\relax + \catcode`\@=12\relax \input \jobname.\indexname s \enddoublecolumns - }% + \fi } % These macros are used by the sorted index file itself. @@ -5554,16 +5637,6 @@ might help (with 'rm \jobname.?? \jobnam \newdimen\entryrightmargin \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 % 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. @@ -5590,7 +5663,7 @@ might help (with 'rm \jobname.?? \jobnam } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% - % Save the text of the entry in \boxA + % Save the text of the entry \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent @@ -5600,21 +5673,12 @@ might help (with 'rm \jobname.?? \jobnam % with catcodes occurring. } {\catcode`\@=11 -% #1 is the page number \gdef\finishentry#1{% - \egroup % end \boxA + \egroup % end box A \dimen@ = \wd\boxA % Length of text of entry - % add any leaders and page number to \boxA. \global\setbox\boxA=\hbox\bgroup - \ifpdforxetex - \iflinkentrytext - \pdflinkpage{#1}{\unhbox\boxA}% - \else - \unhbox\boxA - \fi - \else - \unhbox\boxA - \fi + \unhbox\boxA + % #1 is the page number. % % Get the width of the page numbers, and only use % leaders if they are present. @@ -5633,8 +5697,6 @@ might help (with 'rm \jobname.?? \jobnam \fi \fi \egroup % end \boxA - % - % now output \ifdim\wd\boxB = 0pt \noindent\unhbox\boxA\par \nobreak @@ -5652,17 +5714,41 @@ might help (with 'rm \jobname.?? \jobnam \parfillskip=0pt plus -1fill % \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 \advance\dimen@ii by -1\leftskip \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\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 \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. - \advance\leftskip by \entrycontskip - \advance\parindent by -\entrycontskip + \advance\leftskip by 1em + \advance\parindent by -1em \fi\fi \indent % start paragraph \unhbox\boxA @@ -5685,11 +5771,12 @@ might help (with 'rm \jobname.?? \jobnam \newskip\thinshrinkable \skip\thinshrinkable=.15em minus .15em -% Like plain.tex's \dotfill, except uses up at least 0.5 em. +% Like plain.tex's \dotfill, except uses up at least 1 em. % The filll stretch here overpowers both the fil and fill stretch to push % the page number to the right. \def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll} + \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} + \def\primary #1{\line{#1\hfil}} @@ -5742,7 +5829,7 @@ might help (with 'rm \jobname.?? \jobnam % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % - % We put the result in a separate register, \doublecolumnhsize, so we + % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % @@ -5911,7 +5998,7 @@ might help (with 'rm \jobname.?? \jobnam % Chapters, sections, etc. % Let's start with @part. -\parseargdef\part{\partzzz{#1}} +\outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null @@ -6137,7 +6224,8 @@ might help (with 'rm \jobname.?? \jobnam % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% - \global\advance\unnumberedno by 1 + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty @@ -6193,8 +6281,8 @@ might help (with 'rm \jobname.?? \jobnam % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% - \global\advance\unnumberedno by 1 - \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno}% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. @@ -6217,8 +6305,9 @@ might help (with 'rm \jobname.?? \jobnam % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% - \global\advance\unnumberedno by 1 - \sectionheading{#1}{subsec}{Ynothing}{\the\unnumberedno}% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. @@ -6242,8 +6331,9 @@ might help (with 'rm \jobname.?? \jobnam % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% - \global\advance\unnumberedno by 1 - \sectionheading{#1}{subsubsec}{Ynothing}{\the\unnumberedno}% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according @@ -6306,24 +6396,26 @@ might help (with 'rm \jobname.?? \jobnam \fi } -\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon} +\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak -\global\def\HEADINGSon{\HEADINGSsinglechapoff}} +\global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} -\setchapternewpage on +\CHAPPAGon % \chapmacro - Chapter opening. % @@ -6336,16 +6428,6 @@ might help (with 'rm \jobname.?? \jobnam \def\Yappendixkeyword{Yappendix} \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{% \expandafter\ifx\thisenv\titlepage\else \checkenv{}% chapters, etc., should not start inside an environment. @@ -6368,14 +6450,22 @@ might help (with 'rm \jobname.?? \jobnam \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% - \let\noexpand\thischapter\noexpand\thischapterAppendix + % \noexpand\putwordAppendix avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} + \noexpand\thischapternum: + \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% - \let\noexpand\thischapter\noexpand\thischapterChapter + % \noexpand\putwordChapter avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thischapter{\noexpand\putwordChapter{} + \noexpand\thischapternum: + \noexpand\thischaptername}% }% \fi\fi\fi % @@ -6461,12 +6551,6 @@ might help (with 'rm \jobname.?? \jobnam \def\subsubsecheadingskip{\subsecheadingskip} \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. % @@ -6508,7 +6592,11 @@ might help (with 'rm \jobname.?? \jobnam \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% - \let\noexpand\thissection\noexpand\thissectionDef + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% }% \fi \else @@ -6517,7 +6605,11 @@ might help (with 'rm \jobname.?? \jobnam \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% - \let\noexpand\thissection\noexpand\thissectionDef + % \noexpand\putwordSection avoids expanding indigestible + % commands in some of the translations. + \gdef\noexpand\thissection{\noexpand\putwordSection{} + \noexpand\thissectionnum: + \noexpand\thissectionname}% }% \fi \fi\fi\fi @@ -6677,82 +6769,6 @@ might help (with 'rm \jobname.?? \jobnam \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 \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 @@ -6761,7 +6777,9 @@ might help (with 'rm \jobname.?? \jobnam % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should - % start on an odd page, unlike chapters. + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % @@ -6776,17 +6794,8 @@ might help (with 'rm \jobname.?? \jobnam % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi - \def\thistitle{}% no title in double-sided headings - % Record where the Roman numerals started. - \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 % \jobname.toc even if this is redefined. % @@ -6798,7 +6807,6 @@ might help (with 'rm \jobname.?? \jobnam \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else - \findsecnowidths \readtocfile \fi \vfill \eject @@ -6808,7 +6816,8 @@ might help (with 'rm \jobname.?? \jobnam \fi \closein 1 \endgroup - \contentsendroman + \lastnegativepageno = \pageno + \global\pageno = \savepageno } % And just the chapters. @@ -6826,7 +6835,6 @@ might help (with 'rm \jobname.?? \jobnam \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. - \extrasecnoskip=0.4pt \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry @@ -6844,16 +6852,10 @@ might help (with 'rm \jobname.?? \jobnam \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup - \contentsendroman -} -\let\shortcontents = \summarycontents - -% Get ready to use Arabic numerals again -\def\contentsendroman{% \lastnegativepageno = \pageno - \global\pageno=1 - \contentsendcount = \pagecount + \global\pageno = \savepageno } +\let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. @@ -6862,6 +6864,8 @@ might help (with 'rm \jobname.?? \jobnam % 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. % 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 % with appendix letters. And right-justifying numbers and @@ -6871,15 +6875,10 @@ might help (with 'rm \jobname.?? \jobnam \hbox to 1em{#1\hss}% } -% These macros generate individual entries in the table of contents, -% and are read in from the *.toc file. -% -% 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 +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. @@ -6892,7 +6891,7 @@ might help (with 'rm \jobname.?? \jobnam \vskip 0pt plus 5\baselineskip \penalty-300 \vskip 0pt plus -5\baselineskip - \dochapentry{#1}{\numeralbox}{}% + \dochapentry{\numeralbox\labelspace#1}{}% } % % Parts, in the short toc. @@ -6903,14 +6902,12 @@ might help (with 'rm \jobname.?? \jobnam } % Chapters, in the main contents. -\def\numchapentry#1#2#3#4{% - \retrievesecnowidth\secnowidthchap{#2}% - \dochapentry{#1}{#2}{#4}% -} +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% - \tocentry{#1}{\shortchaplabel{#2}}{#4}% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. @@ -6921,111 +6918,70 @@ might help (with 'rm \jobname.?? \jobnam \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % -\def\appentry#1#2#3#4{% - \retrievesecnowidth\secnowidthchap{#2}% - \dochapentry{\appendixbox{#2}\hskip.7em#1}{}{#4}% -} +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}} % Unnumbered chapters. -\def\unnchapentry#1#2#3#4{\dochapentry{#1}{}{#4}} -\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}} +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. -\def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#4}} - -\def\numsecentry#1#2#3#4{% - \retrievesecnowidth\secnowidthsec{#2}% - \dosecentry{#1}{#2}{#4}% -} +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry -\def\unnsecentry#1#2#3#4{% - \retrievesecnowidth\secnowidthsec{#2}% - \dosecentry{#1}{}{#4}% -} +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. -\def\numsubsecentry#1#2#3#4{% - \retrievesecnowidth\secnowidthssec{#2}% - \dosubsecentry{#1}{#2}{#4}% -} +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry -\def\unnsubsecentry#1#2#3#4{% - \retrievesecnowidth\secnowidthssec{#2}% - \dosubsecentry{#1}{}{#4}% -} +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. -\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#4}} +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \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. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt -% Now for the actual typesetting. In all these, #1 is the text, #2 is -% a section number if present, and #3 is the page number. +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. -\def\dochapentry#1#2#3{% +\def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup % Move the page numbers slightly to the right \advance\entryrightmargin by -0.05em \chapentryfonts - \extrasecnoskip=0.4em % separate chapter number more - \tocentry{#1}{#2}{#3}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } -\def\dosecentry#1#2#3{\begingroup - \secnowidth=\secnowidthchap +\def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent - \tocentry{#1}{#2}{#3}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} -\def\dosubsecentry#1#2#3{\begingroup - \secnowidth=\secnowidthsec +\def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent - \tocentry{#1}{#2}{#3}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} -\def\dosubsubsecentry#1#2#3{\begingroup - \secnowidth=\secnowidthssec +\def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent - \tocentry{#1}{#2}{#3}% + \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} -% Used for the maximum width of a section number so we can align -% section titles. -\newdimen\secnowidth -\secnowidth=0pt -\newdimen\extrasecnoskip -\extrasecnoskip=0pt - -% \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 +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} @@ -7041,7 +6997,7 @@ might help (with 'rm \jobname.?? \jobnam % But \@ or @@ will get a plain @ character. \envdef\tex{% - \setregularquotes + \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie @@ -7171,25 +7127,19 @@ might help (with 'rm \jobname.?? \jobnam \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip -\envparseargdef\cartouche{% + +\envdef\cartouche{% \cartouchefontdefs \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \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 \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 - \advance\cartouter by 11.6pt - % + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % % If this cartouche directly follows a sectioning command, we need the @@ -7197,23 +7147,20 @@ might help (with 'rm \jobname.?? \jobnam % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % - \setbox\groupbox=\vtop\bgroup + \setbox\groupbox=\vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup - \hskip\lskip - \vrule\kern3pt - \vbox\bgroup - \hsize=\cartinner - \baselineskip=\normbskip - \lineskip=\normlskip - \parskip=\normpskip - \def\arg{#1}% - \ifx\arg\empty\else - \centerV{\hfil \bf #1 \hfil}% - \fi - \kern3pt - \vskip -\parskip + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi @@ -7276,7 +7223,7 @@ might help (with 'rm \jobname.?? \jobnam % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: -% @example, @display, @format, @lisp, @verbatim +% @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} @@ -7322,9 +7269,9 @@ might help (with 'rm \jobname.?? \jobnam % \maketwodispenvdef{lisp}{example}{% \nonfillstart - \tt\setcodequotes + \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. - \parsearg\gobble + \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % @@ -7367,6 +7314,22 @@ might help (with 'rm \jobname.?? \jobnam } \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) % and narrows the margins. We keep \parskip nonzero in general, since @@ -7464,10 +7427,9 @@ might help (with 'rm \jobname.?? \jobnam \endgroup % \def\setupverb{% - \tt + \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% - \parindent = 0pt - \setcodequotes + \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and @@ -7482,9 +7444,13 @@ might help (with 'rm \jobname.?? \jobnam \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle -% tabs. +% tabs. The \global is in case the verbatim line starts with an accent, +% or some other command that starts with a begin-group. Otherwise, the +% entire \verbbox would disappear at the corresponding end-group, before +% it is typeset. Meanwhile, we can't have nested verbatim commands +% (can we?), so the \global won't be overwriting itself. \newbox\verbbox -\def\starttabbox{\setbox\verbbox=\hbox\bgroup} +\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active @@ -7495,8 +7461,7 @@ might help (with 'rm \jobname.?? \jobnam \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw - \wd\verbbox=\dimen\verbbox - \leavevmode\box\verbbox \starttabbox + \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup @@ -7506,14 +7471,17 @@ might help (with 'rm \jobname.?? \jobnam \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim - \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% + % The \leavevmode here is for blank lines. Otherwise, we would + % never \starttabbox and the \egroup would end verbatim mode. + \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand - \setcodequotes + \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique @@ -7548,16 +7516,13 @@ might help (with 'rm \jobname.?? \jobnam % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. - \xdef\doverbatim#1^^M#2@end verbatim{% - \starttabbox#2\egroup\noexpand\end\gobble verbatim}% + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. - % The \egroup ends the \verbbox started at the end of the last line in - % the block. \endgroup % \envdef\verbatim{% - \setnormaldispenv\setupverbatim\doverbatim + \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak @@ -7575,7 +7540,7 @@ might help (with 'rm \jobname.?? \jobnam \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \edef\tmp{\noexpand\input #1 } \expandafter - }\expandafter\starttabbox\tmp\egroup + }\tmp \afterenvbreak }% } @@ -7590,11 +7555,9 @@ might help (with 'rm \jobname.?? \jobnam % file; b) letting users define the frontmatter in as flexible order as % possible is desirable. % -\def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying} -{\catcode`\ =\other -\gdef\docopying#1@end copying{\endgroup\def\copyingtext{#1}} -} - +\def\copying{\checkenv{}\begingroup\scanargctxt\docopying} +\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} +% \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page @@ -7642,19 +7605,31 @@ might help (with 'rm \jobname.?? \jobnam \exdentamount=\defbodyindent } -% Called as \printdefunline \deffooheader{text} +\def\dodefunx#1{% + % 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{% \begingroup - \plainfrenchspacing - % call \deffooheader: + % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip - \penalty\defunpenalty % signal to \startdefun and \deffoox + \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts @@ -7663,55 +7638,29 @@ might help (with 'rm \jobname.?? \jobnam \def\Edefun{\endgraf\medbreak} -% @defblock, @defline do not automatically create index entries -\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) } +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remaining is to define \deffnheader. % -% Define \deffoo, \deffoox \Edeffoo and \deffooheader. \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \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{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% - \def#2{% - % 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 + \def#2{\dodefunx#1}% + \def#3% } \newif\ifdoingtypefn % doing typed function? @@ -7736,51 +7685,74 @@ might help (with 'rm \jobname.?? \jobnam \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: % @deffn category name args -\makedefun{deffn}#1 #2 #3\endheader{% - \doind{fn}{\code{#2}}% - \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% -} +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } -% @defop category class name args -\makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}} -\def\defopheaderx#1#2 #3 #4\endheader{% - \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}% - \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}% +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args -\makedefun{deftypefn}#1 #2 #3 #4\endheader{% - \doind{fn}{\code{#3}}% - \doingtypefntrue - \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% -} +\makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args -\makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}} -\def\deftypeopheaderx#1#2 #3 #4 #5\endheader{% - \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}% +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\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 - \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args -\makedefun{deftypevr}#1 #2 #3 #4\endheader{% - \doind{vr}{\code{#3}}% - \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% -} +\makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args -\makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}} -\def\deftypecvheaderx#1#2 #3 #4 #5\endheader{% - \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}% - \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}% +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \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: @@ -7789,15 +7761,17 @@ might help (with 'rm \jobname.?? \jobnam \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args -\makedefun{defcv}#1 {\defcvheaderx{#1\ \putwordof}} -\def\defcvheaderx#1#2 {\deftypecvheaderx{#1}#2 {} } +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% - \printdefname{#1}{}{#2}\defunargs{#3\unskip}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: @@ -7808,19 +7782,19 @@ might help (with 'rm \jobname.?? \jobnam \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } -\makedefun{defmethod}{\defopheaderx\putwordMethodon} -\makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon} -\makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof} -\makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof} +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} -% \printdefname, which formats the name of the @def (not the args). +% \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % -\def\printdefname#1#2#3{% +\def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent @@ -7830,7 +7804,9 @@ might help (with 'rm \jobname.?? \jobnam \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: - \ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}% + \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else + \rettypeownlinetrue + \fi \fi % % How we'll format the category name. Putting it in brackets helps @@ -7874,8 +7850,6 @@ might help (with 'rm \jobname.?? \jobnam \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% - \def\^^M{}% for line continuation - % % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's @@ -7897,23 +7871,30 @@ might help (with 'rm \jobname.?? \jobnam \fi % no return type #3% output function name }% - \ifflagclear{txidefnamenospace}{% - {\rm\enskip}% hskip 0.5 em of \rmfont - }{}% + {\rm\enskip}% hskip 0.5 em of \rmfont % \boldbrax % arguments will be output next, if any. } -% Print arguments. Use slanted for @def*, typewriter for @deftype*. +% Print arguments in slanted roman (not ttsl), inconsistently with using +% 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{% - \bgroup - \def\^^M{}% for line continuation - \df \ifdoingtypefn \tt \else \sl \fi - \ifflagclear{txicodevaristt}{}% - {\def\var##1{{\setregularquotes \ttsl ##1}}}% - #1% - \egroup + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. We used to recommend @var for that, so + % leave the code in, but it's strange for @var to lead to typewriter. + % Nowadays we recommend @code, since the difference between a ttsl hyphen + % and a tt hyphen is pretty tiny. @code also disables ?` !`. + \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% + #1% + \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. @@ -7932,12 +7913,9 @@ might help (with 'rm \jobname.?? \jobnam % so TeX would otherwise complain about undefined control sequence. { \activeparens - \gdef\defcharsdefault{% - \let(=\lparen \let)=\rparen - \let[=\lbrack \let]=\rbrack - \let& = \&% - } - \globaldefs=1 \defcharsdefault + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} @@ -7948,7 +7926,7 @@ might help (with 'rm \jobname.?? \jobnam % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen -\def\amprm#1 {\ampseentrue{\rm\ }} +\def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen @@ -8023,18 +8001,11 @@ might help (with 'rm \jobname.?? \jobnam } \fi -\let\E=\expandafter - % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M - % expand the expansion of \eatleadingcr twice to maybe remove a leading - % newline (and \else and \fi tokens), then call \eatspaces on the result. - \def\xeatspaces##1{% - \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1% - }}% - \def\xempty##1{}% + \def\xeatspaces{\eatspaces}% % % Process the macro body under the current catcode regime. \scantokens{#1@comment}% @@ -8087,11 +8058,6 @@ might help (with 'rm \jobname.?? \jobnam \unbrace{\gdef\trim@@@ #1 } #2@{#1} } -{\catcode`\^^M=\other% -\gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}% -% Warning: this won't work for a delimited argument -% or for an empty argument - % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% @@ -8121,17 +8087,24 @@ might help (with 'rm \jobname.?? \jobnam \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other + \passthroughcharstrue +} + +\def\scanargctxt{% used for copying and captions, not macros. + \scanctxt \catcode`\@=\other + \catcode`\\=\other \catcode`\^^M=\other - \catcode`\\=\active - \passthroughcharstrue } -\def\macrobodyctxt{% used for @macro definitions and @copying +\def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\ =\other + \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other + \catcode`\^^M=\other + \usembodybackslash } % Used when scanning braced macro arguments. Note, however, that catcode @@ -8140,10 +8113,14 @@ might help (with 'rm \jobname.?? \jobnam \def\macroargctxt{% \scanctxt \catcode`\ =\active + \catcode`\@=\other + \catcode`\^^M=\other + \catcode`\\=\active } \def\macrolineargctxt{% used for whole-line arguments without braces \scanctxt + \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other } @@ -8187,7 +8164,7 @@ might help (with 'rm \jobname.?? \jobnam \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi - \begingroup \macrobodyctxt \usembodybackslash + \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} @@ -8202,6 +8179,8 @@ might help (with 'rm \jobname.?? \jobnam \let\commondummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup + \else + \errmessage{Macro #1 not defined}% \fi } @@ -8245,7 +8224,6 @@ might help (with 'rm \jobname.?? \jobnam \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax - \let\xempty\relax \parsemargdefxxx#1,;,% \ifnum\paramno<10\relax\else \paramno0\relax @@ -8257,25 +8235,23 @@ might help (with 'rm \jobname.?? \jobnam \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname - {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}% + {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} -% the \xempty{} is to give \eatleadingcr an argument in the case of an -% empty macro argument. % \parsemacbody, \parsermacbody % % Read recursive and nonrecursive macro bodies. (They're different since % rec and nonrec macros end differently.) % -% We are in \macrobodyctxt, and the \xdef causes backslashes in the macro +% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro % body to be transformed. -% Set \macrobody to the body of the macro, and call \macrodef. +% Set \macrobody to the body of the macro, and call \defmacro. % {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% -\xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% -\xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% % Make @ a letter, so that we can make private-to-Texinfo macro names. \edef\texiatcatcode{\the\catcode`\@} @@ -8494,36 +8470,35 @@ might help (with 'rm \jobname.?? \jobnam % \xdef is used so that macro definitions will survive the file % they're defined in: @include reads the file inside a group. % -\def\macrodef{% +\def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifnum\paramno=1 - \long\def\xeatspaces##1{##1}% - % We don't use \xeatspaces for single-argument macros, because we - % want to keep ends of lines. This definition removes \xeatspaces - % when \macrobody is expanded below. - \else - \def\xeatspaces{\string\xeatspaces}% - % This expands \xeatspaces as a sequence of character tokens, which - % stops \scantokens inserting an extra space after the control sequence. + \def\xeatspaces##1{##1}% + % This removes the pair of braces around the argument. We don't + % use \eatspaces, because this can cause ends of lines to be lost + % when the argument to \eatspaces is read, leading to line-based + % commands like "@itemize" not being read correctly. + \else + \let\xeatspaces\relax % suppress expansion \fi \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% - \begingroup + \bgroup \noexpand\spaceisspace \noexpand\endlineisspace \noexpand\expandafter % skip any whitespace after the macro name. \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname{% - \endgroup + \egroup \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% - \begingroup + \bgroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% - \endgroup + \egroup \noexpand\scanmacro{\macrobody}% }% \else % at most 9 @@ -8534,7 +8509,7 @@ might help (with 'rm \jobname.?? \jobnam % @MACNAME@@@ removes braces surrounding the argument list. % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% - \begingroup + \bgroup \noexpand\expandafter % This \expandafter skip any spaces after the \noexpand\macroargctxt % macro before we change the catcode of space. \noexpand\expandafter @@ -8548,7 +8523,7 @@ might help (with 'rm \jobname.?? \jobnam \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% - \endgroup\noexpand\scanmacro{\macrobody}}% + \egroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% @@ -8670,75 +8645,6 @@ might help (with 'rm \jobname.?? \jobnam \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. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. @@ -8790,11 +8696,9 @@ might help (with 'rm \jobname.?? \jobnam } \def\wordTop{Top} -% Until the next @node, @part or @bye command, divert output to a box that -% is not output. -\def\ignorenode{\setbox\dummybox\vbox\bgroup -\def\part{\egroup\part}% -\def\node{\egroup\node}% +% Until the next @node or @bye command, divert output to a box that is not +% output. +\def\ignorenode{\setbox\dummybox\vbox\bgroup\def\node{\egroup\node}% \ignorenodebye } @@ -8815,11 +8719,6 @@ might help (with 'rm \jobname.?? \jobnam \fi } -% @nodedescription, @nodedescriptionblock - do nothing for TeX -\parseargdef\nodedescription{} -\def\nodedescriptionblock{\doignore{nodedescriptionblock}} - - % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister @@ -8901,11 +8800,109 @@ might help (with 'rm \jobname.?? \jobnam \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % - \getprintedrefname{#1}{#3}{#5}% + % Get args without leading/trailing spaces. + \def\printedrefname{\ignorespaces #3}% + \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% + % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % - \startxreflink{#1}{#4}% + \def\printedmanual{\ignorespaces #5}% + \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 % include an _ in the xref name, etc. @@ -8923,7 +8920,7 @@ might help (with 'rm \jobname.?? \jobnam % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt - \refx{#1-snt}% + \refx{#1-snt}{}% \else \printedrefname \fi @@ -8958,125 +8955,33 @@ might help (with 'rm \jobname.?? \jobnam \else % Reference within this manual. % - % Only output a following space if the -snt ref is nonempty, as the ref - % will be empty for @unnumbered and @anchor. - \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}% + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi % % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % - \ifflagclear{txiomitxrefpg}{% - % We always want a comma - ,% - % output the `page 3'. - \turnoffactive \putpageref{#1}% - % Add a , if xref followed by a space - \if\space\noexpand\tokenafterxref ,% - \else\ifx\ \tokenafterxref ,% @TAB - \else\ifx\*\tokenafterxref ,% @* - \else\ifx\ \tokenafterxref ,% @SPACE - \else\ifx\ - \tokenafterxref ,% @NL - \else\ifx\tie\tokenafterxref ,% @tie - \fi\fi\fi\fi\fi\fi - }{}% + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + % Add a , if xref followed by a space + \if\space\noexpand\tokenafterxref ,% + \else\ifx\ \tokenafterxref ,% @TAB + \else\ifx\*\tokenafterxref ,% @* + \else\ifx\ \tokenafterxref ,% @SPACE + \else\ifx\ + \tokenafterxref ,% @NL + \else\ifx\tie\tokenafterxref ,% @tie + \fi\fi\fi\fi\fi\fi \fi\fi \fi \endlink \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). % % Only include the text "Section ``foo'' in" if the foo is neither @@ -9110,21 +9015,6 @@ might help (with 'rm \jobname.?? \jobnam % \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. % \def\Ynothing{} @@ -9153,8 +9043,9 @@ might help (with 'rm \jobname.?? \jobnam \fi\fi\fi } -% \refx{NAME} - reference a cross-reference string named NAME. -\def\refx#1{% +% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME. SUFFIX +% is output afterwards if non-empty. +\def\refx#1#2{% \requireauxfile {% \indexnofonts @@ -9181,6 +9072,7 @@ might help (with 'rm \jobname.?? \jobnam % It's defined, so just use it. \thisrefX \fi + #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Define a control @@ -9290,10 +9182,10 @@ might help (with 'rm \jobname.?? \jobnam \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other - \catcode`\_=\active - \catcode`\|=\active - \catcode`\<=\active - \catcode`\>=\active + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other @@ -9503,12 +9395,6 @@ might help (with 'rm \jobname.?? \jobnam \imagexxx #1,,,,,\finish \fi } - -% Approximate height of a line in the standard text font. -\newdimen\capheight -\setbox0=\vbox{\tenrm H} -\capheight=\ht0 - % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. @@ -9520,31 +9406,33 @@ might help (with 'rm \jobname.?? \jobnam \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names - \makevalueexpandable + \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro + % If the image is by itself, center it. \ifvmode \imagevmodetrue - \medskip + \else \ifx\centersub\centerV + % 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 % \parskip glue, so insert it here too to equalize the space % above and below. - \vskip\parskip - % - % 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 + \nobreak\vskip\parskip + \nobreak \fi % - \ifx\centersub\centerV - % For @center @image, enter vertical mode and add vertical space - % Enter an extra \parskip because @center doesn't add space itself. - \vbox\bgroup\vskip\parskip\medskip\vskip\parskip - \else - % Enter horizontal mode so that indentation from an enclosing - % environment such as @quotation is respected. - % However, if we're at the top level, we don't want the - % normal paragraph indentation. - \imageindent - \fi + % Leave vertical mode so that indentation from an enclosing + % environment such as @quotation is respected. + % However, if we're at the top level, we don't want the + % normal paragraph indentation. + % On the other hand, if we are in the case of @center @image, we don't + % want to start a paragraph, which will create a hsize-width box and + % eradicate the centering. + \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf @@ -9566,13 +9454,9 @@ might help (with 'rm \jobname.?? \jobnam \fi % \ifimagevmode - \egroup \medskip % space after a standalone image \fi - \ifx\centersub\centerV % @center @image - \medskip - \egroup % close \vbox - \fi + \ifx\centersub\centerV \egroup \fi \endgroup} @@ -9739,8 +9623,8 @@ might help (with 'rm \jobname.?? \jobnam % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} -\def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz} -\def\docaptionz#1#2{\egroup \def#1{#2}} +\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} +\def\defcaption#1#2{\egroup \def#1{#2}} % 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. @@ -10029,10 +9913,12 @@ directory should work if nowhere else do % For native Unicode handling (XeTeX and LuaTeX) \nativeunicodechardefs \else - % 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. + % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX) \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 % \else @@ -10057,6 +9943,7 @@ directory should work if nowhere else do \fi } +% emacs-page % A message to be logged when using a character that isn't available % the default font encoding (OT1). % @@ -10065,6 +9952,12 @@ directory should work if nowhere else do % Take account of \c (plain) vs. \, (Texinfo) difference. \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{% \gdef#1{% \ifpassthroughchars @@ -10074,14 +9967,8 @@ directory should work if nowhere else do \fi }} -\begingroup - -% Make non-ASCII characters active for defining the character definition -% macros. -\setnonasciicharscatcode\active - % Latin1 (ISO-8859-1) character definitions. -\gdef\latonechardefs{% +\def\latonechardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\exclamdown} \gdefchar^^a2{{\tcfont \char162}} % cent @@ -10186,7 +10073,7 @@ directory should work if nowhere else do } % Latin9 (ISO-8859-15) encoding character definitions. -\gdef\latninechardefs{% +\def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % @@ -10201,7 +10088,7 @@ directory should work if nowhere else do } % Latin2 (ISO-8859-2) character definitions. -\gdef\lattwochardefs{% +\def\lattwochardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\ogonek{A}} \gdefchar^^a2{\u{}} @@ -10219,7 +10106,7 @@ directory should work if nowhere else do \gdefchar^^ae{\v Z} \gdefchar^^af{\dotaccent Z} % - \gdefchar^^b0{\textdegree} + \gdefchar^^b0{\textdegree{}} \gdefchar^^b1{\ogonek{a}} \gdefchar^^b2{\ogonek{ }} \gdefchar^^b3{\l} @@ -10305,8 +10192,6 @@ directory should work if nowhere else do \gdefchar^^ff{\dotaccent{}} } -\endgroup % active chars - % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some @@ -10458,9 +10343,9 @@ directory should work if nowhere else do % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp % to the corresponding UTF-8 sequence. \gdef\parseXMLCharref{% - \ifnum\countUTFz < "20\relax + \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple - \errmessage{Cannot define Unicode char value < 0020}% + \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctetsName.,% @@ -10530,103 +10415,6 @@ directory should work if nowhere else do % least make most of the characters not bomb out. % \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{00A1}{\exclamdown}% \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent @@ -10644,7 +10432,7 @@ directory should work if nowhere else do \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% \DeclareUnicodeCharacter{00AF}{\={ }}% % - \DeclareUnicodeCharacter{00B0}{\textdegree}% + \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}% \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% \DeclareUnicodeCharacter{00B2}{$^2$}% \DeclareUnicodeCharacter{00B3}{$^3$}% @@ -10918,8 +10706,6 @@ directory should work if nowhere else do \DeclareUnicodeCharacter{0233}{\=y}% \DeclareUnicodeCharacter{0237}{\dotless{j}}% % - \DeclareUnicodeCharacter{02BC}{'}% - % \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% % % Greek letters upper case @@ -11126,9 +10912,6 @@ directory should work if nowhere else do \DeclareUnicodeCharacter{1EF8}{\~Y}% \DeclareUnicodeCharacter{1EF9}{\~y}% % - % Exotic spaces - \DeclareUnicodeCharacter{2007}{\hphantom{0}}% - % % Punctuation \DeclareUnicodeCharacter{2013}{--}% \DeclareUnicodeCharacter{2014}{---}% @@ -11148,7 +10931,7 @@ directory should work if nowhere else do % \DeclareUnicodeCharacter{20AC}{\euro{}}% % - \DeclareUnicodeCharacter{2192}{\arrow}% + \DeclareUnicodeCharacter{2192}{\expansion{}}% \DeclareUnicodeCharacter{21D2}{\result{}}% % % Mathematical symbols @@ -11311,26 +11094,24 @@ directory should work if nowhere else do % provide a definition macro to replace/pass-through a Unicode character % \def\DeclareUnicodeCharacterNative#1#2{% - \ifnum"#1>"7F % only make non-ASCII chars active - \catcode"#1=\active - \def\dodeclareunicodecharacternative##1##2##3{% - \begingroup - \uccode`\~="##2\relax - \uppercase{\gdef~}{% - \ifpassthroughchars - ##1% - \else - ##3% - \fi - } - \endgroup - } + \catcode"#1=\active + \def\dodeclareunicodecharacternative##1##2##3{% \begingroup - \uccode`\.="#1\relax - \uppercase{\def\UTFNativeTmp{.}}% - \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% + \uccode`\~="##2\relax + \uppercase{\gdef~}{% + \ifpassthroughchars + ##1% + \else + ##3% + \fi + } \endgroup - \fi + } + \begingroup + \uccode`\.="#1\relax + \uppercase{\def\UTFNativeTmp{.}}% + \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% + \endgroup } % Native Unicode handling (XeTeX and LuaTeX) character replacing definition. @@ -11359,14 +11140,14 @@ directory should work if nowhere else do \relax } -% Define all Unicode characters we know about +% Define all Unicode characters we know about. This makes UTF-8 the default +% input encoding and allows @U to work. \iftxinativeunicodecapable \nativeunicodechardefsatu \else \utfeightchardefs \fi - \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt @@ -11413,9 +11194,13 @@ directory should work if nowhere else do % \vsize = #1\relax \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin \txipageheight = \vsize % \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in \txipagewidth = \hsize % \normaloffset = #4\relax @@ -11472,6 +11257,23 @@ directory should work if nowhere else do \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. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt @@ -11505,7 +11307,7 @@ directory should work if nowhere else do \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% - {\voffset}{-11.4mm}% + {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % @@ -11538,18 +11340,6 @@ directory should work if nowhere else do \globaldefs = 0 }} -\def\bsixpaper{{\globaldefs = 1 - \afourpaper - \internalpagesizes{140mm}{100mm}% - {-6.35mm}{-12.7mm}% - {\bindingoffset}{14pt}% - {176mm}{125mm}% - \let\SETdispenvsize=\smallword - \lispnarrowing = 0.2in - \globaldefs = 0 -}} - - % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. @@ -11563,12 +11353,12 @@ directory should work if nowhere else do \setleading{\textleading}% % \dimen0 = #1\relax - \advance\dimen0 by 2.5in % default 1in margin above heading line - % and 1.5in to include heading, footing and - % bottom margin + \advance\dimen0 by \voffset + \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page % \dimen2 = \hsize - \advance\dimen2 by 2in % default to 1 inch margin on each side + \advance\dimen2 by \normaloffset + \advance\dimen2 by 1in % reference point is 1 inch from left edge of page % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% @@ -11584,138 +11374,9 @@ directory should work if nowhere else do \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.} -% Make UTF-8 the default encoding. -\documentencodingzzz{UTF-8} - \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. \catcode`\^^? = 14 @@ -11731,6 +11392,23 @@ directory should work if nowhere else do \catcode`\|=\other \def\normalverticalbar{|} \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 % Active characters for printing the wanted glyph. @@ -11767,7 +11445,7 @@ directory should work if nowhere else do \let> = \activegtr \let~ = \activetilde \let^ = \activehat - \setregularquotes + \markupsetuplqdefault \markupsetuprqdefault \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. @@ -11776,32 +11454,23 @@ directory should work if nowhere else do % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% - \passthroughcharstrue - \let-=\normaldash - \let"=\normaldoublequote - \let$=\normaldollar %$ font-lock fix - \let+=\normalplus - \let<=\normalless - \let>=\normalgreater - \let^=\normalcaret - \let_=\normalunderscore - \let|=\normalverticalbar - \let~=\normaltilde + \normalturnoffactive \otherbackslash - \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 \loadconf turn them back on. -\catcode`+=\other \catcode`\_=\other - +\catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \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 % \backslashcurfont: the story here is that in math mode, the \char % of \backslashcurfont ends up printing the roman \ from the math symbol @@ -11811,125 +11480,110 @@ directory should work if nowhere else do % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. -\def\ttbackslash{{\tt \ifmmode \mathchar29020 \else \backslashcurfont \fi}} -\let\backslashchar = \ttbackslash % \backslashchar{} is for user documents. +@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} +@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents. -% These are made active for url-breaking, so need -% active definitions as the normal characters. -\def\normaldot{.} -\def\normalquest{?} -\def\normalslash{/} - -% \newlinesloadsconf - call \loadconf as soon as possible in the -% file, e.g. at the first newline. -% -{\catcode`\^=7 -\catcode`\^^M=13 -\gdef\newlineloadsconf{% - \catcode`\^^M=13 % - \newlineloadsconfzz% -} -\gdef\newlineloadsconfzz#1^^M{% - \def\c{\loadconf\c}% - % Definition for the first newline read in the file - \def ^^M{\loadconf}% - % In case the first line has a whole-line or environment command on it - \let\originalparsearg\parsearg% - \def\parsearg{\loadconf\originalparsearg}% - % - % \startenvironment is in the expansion of commands defined with \envdef - \let\originalstartenvironment\startenvironment% - \def\startenvironment{\loadconf\startenvironment}% +% \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 + @markupsetuplqdefault + @markupsetuprqdefault + @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' +% +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% 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. +% This is used on the very last line of this file, texinfo.tex. +% We also use @c to call @fixbackslash, in case ends of lines are hidden. +{ +@catcode`@^=7 +@catcode`@^^M=13@gdef@enablebackslashhack{% + @global@let\ = @eatinput% + @catcode`@^^M=13% + @def@c{@fixbackslash@c}% + % Definition for the newline at the end of this file. + @def ^^M{@let^^M@secondlinenl}% + % Definition for a newline in the main Texinfo file. + @gdef @secondlinenl{@fixbackslash}% + % In case the first line has a whole-line command on it + @let@originalparsearg@parsearg + @def@parsearg{@fixbackslash@originalparsearg} }} +{@catcode`@^=7 @catcode`@^^M=13% +@gdef@eatinput input texinfo#1^^M{@fixbackslash}} % Emergency active definition of newline, in case an active newline token % appears by mistake. -{\catcode`\^=7 \catcode13=13% -\gdef\enableemergencynewline{% - \gdef^^M{% - \par% - %\par% +{@catcode`@^=7 @catcode13=13% +@gdef@enableemergencynewline{% + @gdef^^M{% + @par% + %@par% }}} -% \loadconf gets called at the beginning of every Texinfo file. -% If texinfo.cnf is present on the system, read it. Useful for site-wide -% @afourpaper, etc. Not opening texinfo.cnf directly in texinfo.tex -% makes it possible to make a format file for Texinfo. -% -\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 - % +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @ttbackslash @fi + @catcode13=5 % regular end of line + @enableemergencynewline + @let@c=@comment + @let@parsearg@originalparsearg % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. - \catcode`+=\active - \catcode`\_=\active + @catcode`+=@active + @catcode`@_=@active % - \openin 1 texinfo.cnf - \ifeof 1 \else \input texinfo.cnf \fi - \closein 1 + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. This macro, @fixbackslash, gets + % called at the beginning of every Texinfo file. Not opening texinfo.cnf + % 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. @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. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @@ -11944,11 +11598,17 @@ directory should work if nowhere else do @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active +@markupsetuplqdefault +@markupsetuprqdefault @c Local variables: -@c eval: (add-hook 'before-save-hook 'time-stamp nil t) -@c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}" -@c page-delimiter: "^\\\\message" +@c eval: (add-hook 'before-save-hook 'time-stamp) +@c page-delimiter: "^\\\\message\\|emacs-page" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" @c End: -@newlineloadsconf +@c vim:sw=2: + +@enablebackslashhack