diff options
Diffstat (limited to 'build-aux/texinfo.tex')
| -rw-r--r-- | build-aux/texinfo.tex | 7406 | 
1 files changed, 5048 insertions, 2358 deletions
| diff --git a/build-aux/texinfo.tex b/build-aux/texinfo.tex index bac07260..a774790c 100644 --- a/build-aux/texinfo.tex +++ b/build-aux/texinfo.tex @@ -1,13 +1,14 @@  % texinfo.tex -- TeX macros to handle Texinfo files. -% +%   % Load plain if necessary, i.e., if running under initex.  \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi  % -\def\texinfoversion{2008-04-18.10} +\def\texinfoversion{2017-08-23.19}  % -% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,  % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, -% 2007, 2008 Free Software Foundation, Inc. +% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 +% 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 @@ -24,13 +25,14 @@  %  % As a special exception, when this file is read by TeX when processing  % a Texinfo source document, you may use the result without -% restriction.  (This has been our intent since Texinfo was invented.) +% restriction. This Exception is an additional permission under section 7 +% of the GNU General Public License, version 3 ("GPLv3").  %  % Please try the latest version of texinfo.tex before submitting bug  % reports; you can get the latest version from: -%   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or -%   ftp://tug.org/tex/texinfo.tex -%     (and all CTAN mirrors, see http://www.ctan.org). +%   http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or +%   http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or +%   http://www.gnu.org/software/texinfo/ (the Texinfo home page)  % The texinfo.tex in any given distribution could well be out  % of date, so if that's what you're using, please check.  % @@ -65,6 +67,9 @@  \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}%  \chardef\other=12 @@ -93,11 +98,15 @@  \let\ptexnewwrite\newwrite  \let\ptexnoindent=\noindent  \let\ptexplus=+ +\let\ptexraggedright=\raggedright  \let\ptexrbrace=\}  \let\ptexslash=\/ +\let\ptexsp=\sp  \let\ptexstar=\* +\let\ptexsup=\sup  \let\ptext=\t  \let\ptextop=\top +{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode  % If this character appears in an error message or help string, it  % starts a new line in the output. @@ -115,10 +124,11 @@  % Set up fixed words for English if not already set.  \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi  \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi +\ifx\putworderror\undefined     \gdef\putworderror{error}\fi  \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi  \ifx\putwordin\undefined        \gdef\putwordin{in}\fi -\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi -\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi  \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi  \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi  \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi @@ -152,20 +162,14 @@  \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi  \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi -% Since the category of space is not known, we have to be careful. -\chardef\spacecat = 10 -\def\spaceisspace{\catcode`\ =\spacecat} +% Give the space character the catcode for a space. +\def\spaceisspace{\catcode`\ =10\relax} + +% Likewise for ^^M, the end of line character. +\def\endlineisspace{\catcode13=10\relax} -% sometimes characters are active, so we need control sequences. -\chardef\colonChar = `\: -\chardef\commaChar = `\,  \chardef\dashChar  = `\- -\chardef\dotChar   = `\. -\chardef\exclamChar= `\! -\chardef\lquoteChar= `\` -\chardef\questChar = `\? -\chardef\rquoteChar= `\' -\chardef\semiChar  = `\; +\chardef\slashChar = `\/  \chardef\underChar = `\_  % Ignore a token. @@ -187,46 +191,6 @@    wide-spread wrap-around  } -% Margin to add to right of even pages, to left of odd pages. -\newdimen\bindingoffset -\newdimen\normaloffset -\newdimen\pagewidth \newdimen\pageheight - -% For a final copy, take out the rectangles -% that mark overfull boxes (in case you have decided -% that the text looks ok even though it passes the margin). -% -\def\finalout{\overfullrule=0pt} - -% @| inserts a changebar to the left of the current line.  It should -% surround any changed text.  This approach does *not* work if the -% change spans more than two lines of output.  To handle that, we would -% have adopt a much more difficult approach (putting marks into the main -% vertical list for the beginning and end of each change). -% -\def\|{% -  % \vadjust can only be used in horizontal mode. -  \leavevmode -  % -  % Append this vertical mode material after the current line in the output. -  \vadjust{% -    % We want to insert a rule with the height and depth of the current -    % leading; that is exactly what \strutbox is supposed to record. -    \vskip-\baselineskip -    % -    % \vadjust-items are inserted at the left edge of the type.  So -    % the \llap here moves out into the left-hand margin. -    \llap{% -      % -      % For a thicker or thinner bar, change the `1pt'. -      \vrule height\baselineskip width1pt -      % -      % This is the space between the bar and the text. -      \hskip 12pt -    }% -  }% -} -  % Sometimes it is convenient to have everything in the transcript file  % and nothing on the terminal.  We don't just call \tracingall here,  % since that produces some useless output on the terminal.  We also make @@ -243,7 +207,7 @@    \tracingmacros2    \tracingrestores1    \showboxbreadth\maxdimen \showboxdepth\maxdimen -  \ifx\eTeXversion\undefined\else % etex gives us more logging +  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging      \tracingscantokens1      \tracingifs1      \tracinggroups1 @@ -254,6 +218,13 @@    \errorcontextlines16  }% +% @errormsg{MSG}.  Do the index-like expansions on MSG, but if things +% aren't perfect, it's not the end of the world, being an error message, +% after all. +%  +\def\errormsg{\begingroup \indexnofonts \doerrormsg} +\def\doerrormsg#1{\errmessage{#1}} +  % add check for \lastpenalty to plain's definitions.  If the last thing  % we did was a \nobreak, we don't want to insert more space.  % @@ -264,7 +235,15 @@  \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount    \removelastskip\penalty-200\bigskip\fi\fi} -% For @cropmarks command. +% Output routine +% + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt } +  % Do @cropmarks to get crop marks.  %  \newif\ifcropmarks @@ -287,10 +266,18 @@  %  % Another complication is to let the user choose whether \thischapter  % (\thissection) refers to the chapter (section) in effect at the top -% of a page, or that at the bottom of a page.  The solution is -% described on page 260 of The TeXbook.  It involves outputting two -% marks for the sectioning macros, one before the section break, and -% one after.  I won't pretend I can describe this better than DEK... +% of a page, or that at the bottom of a page. + +% \domark is called twice inside \chapmacro, to add one +% mark before the section break, and one after. +%   In the second call \prevchapterdefs is the same as \lastchapterdefs, +% and \prevsectiondefs is the same as \lastsectiondefs. +%   Then if the page is not broken at the mark, some of the previous +% section appears on the page, and we can get the name of this section +% from \firstmark for @everyheadingmarks top. +%   @everyheadingmarks bottom uses \botmark. +% +% See page 260 of The TeXbook.  \def\domark{%    \toks0=\expandafter{\lastchapterdefs}%    \toks2=\expandafter{\lastsectiondefs}% @@ -298,11 +285,15 @@    \toks6=\expandafter{\prevsectiondefs}%    \toks8=\expandafter{\lastcolordefs}%    \mark{% -                   \the\toks0 \the\toks2 -      \noexpand\or \the\toks4 \the\toks6 -    \noexpand\else \the\toks8 +                   \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top +      \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom +    \noexpand\else \the\toks8             % 2: color marks    }%  } + +% \gettopheadingmarks, \getbottomheadingmarks, +% \getcolormarks - extract needed part of mark. +%  % \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., @@ -318,33 +309,67 @@  % Avoid "undefined control sequence" errors.  \def\lastchapterdefs{}  \def\lastsectiondefs{} +\def\lastsection{}  \def\prevchapterdefs{}  \def\prevsectiondefs{}  \def\lastcolordefs{} +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\txipagewidth \newdimen\txipageheight +  % Main output routine. +%  \chardef\PAGE = 255  \output = {\onepageout{\pagecontents\PAGE}}  \newbox\headlinebox  \newbox\footlinebox -% \onepageout takes a vbox as an argument.  Note that \pagecontents -% does insertions, but you have to call it yourself. +% \onepageout takes a vbox as an argument. +% \shipout a vbox for a single page, adding an optional header, footer, +% cropmarks, and footnote.  This also causes index entries for this page +% to be written to the auxiliary files. +%  \def\onepageout#1{%    \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi    %    \ifodd\pageno  \advance\hoffset by \bindingoffset    \else \advance\hoffset by -\bindingoffset\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\commmonheadfootline{\let\hsize=\txipagewidth \texinfochars} +  % +  % 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\topmark\fi +  \let\prevchaptername\thischaptername +  \ifcase0\firstmark\fi +  \let\curchaptername\thischaptername +  %    \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi -  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%    \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi -  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% +  % +  \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 +  % +  \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% +  \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%    %    {% +    % Set context for writing to auxiliary files like index files.      % Have to do this stuff outside the \shipout because we want it to      % take effect in \write's, yet the group defined by the \vbox ends      % before the \shipout runs. @@ -353,10 +378,10 @@      \normalturnoffactive  % \ in index entries must not stay \, e.g., if                 % the page break happens to be in the middle of an example.                 % We don't want .vr (or whatever) entries like this: -               % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} +               % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}}                 % "\acronym" won't work when it's read back in; -               % it needs to be  -               % {\code {{\tt \backslashcurfont }acronym} +               % it needs to be +               % {\code {{\backslashcurfont }acronym}      \shipout\vbox{%        % Do this early so pdf references go to the beginning of the page.        \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi @@ -414,7 +439,8 @@  \newinsert\margin \dimen\margin=\maxdimen -\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +% Main part of page, including any footnotes +\def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}  {\catcode`\@ =11  \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi  % marginal hacks, juha@viisa.uucp (Juha Takala) @@ -436,9 +462,13 @@  \def\nsbot{\vbox    {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Argument parsing +  % Parse an argument, then pass it to #1.  The argument is the rest of  % the input line (except we remove a trailing comment).  #1 should be a  % macro which expects an ordinary undelimited TeX argument. +% For example, \def\foo{\parsearg\fooxxx}.  %  \def\parsearg{\parseargusing{}}  \def\parseargusing#1#2{% @@ -457,9 +487,11 @@    }%  } -% First remove any @comment, then any @c comment. +% First remove any @comment, then any @c comment.  Also remove a @texinfoc +% comment (see \scanmacro for details).  Pass the result on to \argcheckspaces.  \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} -\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm} +\def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}  % Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.  % @@ -494,14 +526,13 @@  %  \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} + +% \parseargdef - define a command taking an argument on the line +%  % \parseargdef\foo{...}  %	is roughly equivalent to  % \def\foo{\parsearg\Xfoo}  % \def\Xfoo#1{...} -% -% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my -% favourite TeX trick.  --kasal, 16nov03 -  \def\parseargdef#1{%    \expandafter \doparseargdef \csname\string#1\endcsname #1%  } @@ -574,7 +605,7 @@  }  \def\inenvironment#1{%    \ifx#1\empty -    out of any environment% +    outside of any environment%    \else      in environment \expandafter\string#1%    \fi @@ -586,7 +617,7 @@  \parseargdef\end{%    \if 1\csname iscond.#1\endcsname    \else -    % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 +    % The general wording of \badenverr may not be ideal.      \expandafter\checkenv\csname#1\endcsname      \csname E#1\endcsname      \endgroup @@ -596,85 +627,6 @@  \newhelp\EMsimple{Press RETURN to continue.} -%% Simple single-character @ commands - -% @@ prints an @ -% Kludge this until the fonts are right (grr). -\def\@{{\tt\char64}} - -% This is turned off because it was never documented -% and you can use @w{...} around a quote to suppress ligatures. -%% Define @` and @' to be the same as ` and ' -%% but suppressing ligatures. -%\def\`{{`}} -%\def\'{{'}} - -% Used to generate quoted braces. -\def\mylbrace {{\tt\char123}} -\def\myrbrace {{\tt\char125}} -\let\{=\mylbrace -\let\}=\myrbrace -\begingroup -  % Definitions to produce \{ and \} commands for indices, -  % and @{ and @} for the aux/toc files. -  \catcode`\{ = \other \catcode`\} = \other -  \catcode`\[ = 1 \catcode`\] = 2 -  \catcode`\! = 0 \catcode`\\ = \other -  !gdef!lbracecmd[\{]% -  !gdef!rbracecmd[\}]% -  !gdef!lbraceatcmd[@{]% -  !gdef!rbraceatcmd[@}]% -!endgroup - -% @comma{} to avoid , parsing problems. -\let\comma = , - -% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent -% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. -\let\, = \c -\let\dotaccent = \. -\def\ringaccent#1{{\accent23 #1}} -\let\tieaccent = \t -\let\ubaraccent = \b -\let\udotaccent = \d - -% Other special characters: @questiondown @exclamdown @ordf @ordm -% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. -\def\questiondown{?`} -\def\exclamdown{!`} -\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} -\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} - -% Dotless i and dotless j, used for accents. -\def\imacro{i} -\def\jmacro{j} -\def\dotless#1{% -  \def\temp{#1}% -  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi -  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi -  \else \errmessage{@dotless can be used only with i or j}% -  \fi\fi -} - -% The \TeX{} logo, as in plain, but resetting the spacing so that a -% period following counts as ending a sentence.  (Idea found in latex.) -% -\edef\TeX{\TeX \spacefactor=1000 } - -% @LaTeX{} logo.  Not quite the same results as the definition in -% latex.ltx, since we use a different font for the raised A; it's most -% convenient for us to use an explicitly smaller font, rather than using -% the \scriptstyle font (since we don't reset \scriptstyle and -% \scriptscriptstyle). -% -\def\LaTeX{% -  L\kern-.36em -  {\setbox0=\hbox{T}% -   \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% -  \kern-.15em -  \TeX -} -  % Be sure we're in horizontal mode when doing a tie, since we make space  % equivalent to this in @example-like environments. Otherwise, a space  % at the beginning of a line will start with \penalty -- and @@ -691,7 +643,7 @@  \def\:{\spacefactor=1000 }  % @* forces a line break. -\def\*{\hfil\break\hbox{}\ignorespaces} +\def\*{\unskip\hfil\break\hbox{}\ignorespaces}  % @/ allows a line break.  \let\/=\allowbreak @@ -706,7 +658,7 @@  \def\?{?\spacefactor=\endofsentencespacefactor\space}  % @frenchspacing on|off  says whether to put extra space after punctuation. -%  +%  \def\onword{on}  \def\offword{off}  % @@ -716,7 +668,7 @@    \else\ifx\temp\offword \plainnonfrenchspacing    \else      \errhelp = \EMsimple -    \errmessage{Unknown @frenchspacing option `\temp', must be on/off}% +    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%    \fi\fi  } @@ -770,21 +722,26 @@      \endgraf % Not \par, as it may have been set to \lisppar.      \global\dimen1 = \prevdepth    \egroup           % End the \vtop. +  \addgroupbox +  \prevdepth = \dimen1 +  \checkinserts +} + +\def\addgroupbox{    % \dimen0 is the vertical size of the group's box.    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox    % \dimen2 is how much space is left on the page (more or less). -  \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal +  \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal    % if the group doesn't fit on the current page, and it's a big big    % group, force a page break.    \ifdim \dimen0 > \dimen2 -    \ifdim \pagetotal < \vfilllimit\pageheight +    \ifdim \pagetotal < \vfilllimit\txipageheight        \page      \fi    \fi    \box\groupbox -  \prevdepth = \dimen1 -  \checkinserts  } +  %  % TeX puts in an \escapechar (i.e., `@') at the beginning of the help  % message, so this ends up printing `@group can only ...'. @@ -798,15 +755,6 @@ where each line of input produces a line of output.}  \newdimen\mil  \mil=0.001in -% Old definition--didn't work. -%\parseargdef\need{\par % -%% This method tries to make TeX break the page naturally -%% if the depth of the box does not fit. -%{\baselineskip=0pt% -%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak -%\prevdepth=-1000pt -%}} -  \parseargdef\need{%    % Ensure vertical mode, so we don't make a big box in the middle of a    % paragraph. @@ -870,7 +818,7 @@ where each line of input produces a line of output.}  % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current  % paragraph.  For more general purposes, use the \margin insertion -% class.  WHICH is `l' or `r'. +% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.  %  \newskip\inmarginspacing \inmarginspacing=1cm  \def\strutdepth{\dp\strutbox} @@ -926,6 +874,8 @@ where each line of input produces a line of output.}    {%      \makevalueexpandable  % we want to expand any @value in FILE.      \turnoffactive        % and allow special characters in the expansion +    \indexnofonts         % Allow `@@' and other weird things in file names. +    \wlog{texinfo.tex: doing @include of #1^^J}%      \edef\temp{\noexpand\input #1 }%      %      % This trickery is to read FILE outside of a group, in case it makes @@ -944,6 +894,8 @@ where each line of input produces a line of output.}    \catcode`>=\other    \catcode`+=\other    \catcode`-=\other +  \catcode`\`=\other +  \catcode`\'=\other  }  \def\pushthisfilestack{% @@ -959,7 +911,7 @@ where each line of input produces a line of output.}  \def\popthisfilestack{\errthisfilestackempty}  \def\errthisfilestackempty{\errmessage{Internal error:    the stack of filenames is empty.}} - +%  \def\thisfile{}  % @center line @@ -967,37 +919,48 @@ where each line of input produces a line of output.}  %  \parseargdef\center{%    \ifhmode -    \let\next\centerH +    \let\centersub\centerH    \else -    \let\next\centerV +    \let\centersub\centerV    \fi -  \next{\hfil \ignorespaces#1\unskip \hfil}% +  \centersub{\hfil \ignorespaces#1\unskip \hfil}% +  \let\centersub\relax % don't let the definition persist, just in case  } -\def\centerH#1{% -  {% -    \hfil\break -    \advance\hsize by -\leftskip -    \advance\hsize by -\rightskip -    \line{#1}% -    \break -  }% +\def\centerH#1{{% +  \hfil\break +  \advance\hsize by -\leftskip +  \advance\hsize by -\rightskip +  \line{#1}% +  \break +}} +% +\newcount\centerpenalty +\def\centerV#1{% +  % The idea here is the same as in \startdefun, \cartouche, etc.: if +  % @center is the first thing after a section heading, we need to wipe +  % out the negative parskip inserted by \sectionheading, but still +  % prevent a page break here. +  \centerpenalty = \lastpenalty +  \ifnum\centerpenalty>10000 \vskip\parskip \fi +  \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi +  \line{\kern\leftskip #1\kern\rightskip}%  } -\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}  % @sp n   outputs n lines of vertical space - +%  \parseargdef\sp{\vskip #1\baselineskip}  % @comment ...line which is ignored...  % @c is the same as @comment  % @ignore ... @end ignore  is another way to write a comment -\def\comment{\begingroup \catcode`\^^M=\other% -\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% -\commentxxx} -{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} -\let\c=\comment +\def\c{\begingroup \catcode`\^^M=\active% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\cxxx} +{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} +% +\let\comment\c  % @paragraphindent NCHARS  % We'll use ems for NCHARS, close enough. @@ -1068,170 +1031,23 @@ where each line of input produces a line of output.}  % paragraph.  %  \gdef\dosuppressfirstparagraphindent{% -  \gdef\indent{% -    \restorefirstparagraphindent -    \indent -  }% -  \gdef\noindent{% -    \restorefirstparagraphindent -    \noindent -  }% -  \global\everypar = {% -    \kern -\parindent -    \restorefirstparagraphindent -  }% -} - -\gdef\restorefirstparagraphindent{% -  \global \let \indent = \ptexindent -  \global \let \noindent = \ptexnoindent -  \global \everypar = {}% +  \gdef\indent  {\restorefirstparagraphindent \indent}% +  \gdef\noindent{\restorefirstparagraphindent \noindent}% +  \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%  } - - -% @asis just yields its argument.  Used with @table, for example. -% -\def\asis#1{#1} - -% @math outputs its argument in math mode. -% -% One complication: _ usually means subscripts, but it could also mean -% an actual _ character, as in @math{@var{some_variable} + 1}.  So make -% _ active, and distinguish by seeing if the current family is \slfam, -% which is what @var uses. -{ -  \catcode`\_ = \active -  \gdef\mathunderscore{% -    \catcode`\_=\active -    \def_{\ifnum\fam=\slfam \_\else\sb\fi}% -  } -} -% Another complication: we want \\ (and @\) to output a \ character. -% FYI, plain.tex uses \\ as a temporary control sequence (why?), but -% this is not advertised and we don't care.  Texinfo does not -% otherwise define @\. -% -% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. -\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}  % -\def\math{% -  \tex -  \mathunderscore -  \let\\ = \mathbackslash -  \mathactive -  % make the texinfo accent commands work in math mode -  \let\"=\ddot -  \let\'=\acute -  \let\==\bar -  \let\^=\hat -  \let\`=\grave -  \let\u=\breve -  \let\v=\check -  \let\~=\tilde -  \let\dotaccent=\dot -  $\finishmath -} -\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex. - -% Some active characters (such as <) are spaced differently in math. -% We have to reset their definitions in case the @math was an argument -% to a command which sets the catcodes (such as @item or @section). -% -{ -  \catcode`^ = \active -  \catcode`< = \active -  \catcode`> = \active -  \catcode`+ = \active -  \gdef\mathactive{% -    \let^ = \ptexhat -    \let< = \ptexless -    \let> = \ptexgtr -    \let+ = \ptexplus -  } -} - -% Some math mode symbols. -\def\bullet{$\ptexbullet$} -\def\geq{\ifmmode \ge\else $\ge$\fi} -\def\leq{\ifmmode \le\else $\le$\fi} -\def\minus{\ifmmode -\else $-$\fi} - -% @dots{} outputs an ellipsis using the current font. -% We do .5em per period so that it has the same spacing in the cm -% typewriter fonts as three actual period characters; on the other hand, -% in other typewriter fonts three periods are wider than 1.5em.  So do -% whichever is larger. -% -\def\dots{% -  \leavevmode -  \setbox0=\hbox{...}% get width of three periods -  \ifdim\wd0 > 1.5em -    \dimen0 = \wd0 -  \else -    \dimen0 = 1.5em -  \fi -  \hbox to \dimen0{% -    \hskip 0pt plus.25fil -    .\hskip 0pt plus1fil -    .\hskip 0pt plus1fil -    .\hskip 0pt plus.5fil -  }% -} - -% @enddots{} is an end-of-sentence ellipsis. -% -\def\enddots{% -  \dots -  \spacefactor=\endofsentencespacefactor +\gdef\restorefirstparagraphindent{% +  \global\let\indent = \ptexindent +  \global\let\noindent = \ptexnoindent +  \global\everypar = {}%  } -% @comma{} is so commas can be inserted into text without messing up -% Texinfo's parsing. -% -\let\comma = ,  % @refill is a no-op.  \let\refill=\relax -% If working on a large document in chapters, it is convenient to -% be able to disable indexing, cross-referencing, and contents, for test runs. -% This is done with @novalidate (before @setfilename). -% -\newif\iflinks \linkstrue % by default we want the aux files. -\let\novalidate = \linksfalse - -% @setfilename is done at the beginning of every texinfo file. -% So open here the files we need to have open while reading the input. -% This makes it possible to make a .fmt file for texinfo. -\def\setfilename{% -   \fixbackslash  % Turn off hack to swallow `\input texinfo'. -   \iflinks -     \tryauxfile -     % Open the new aux file.  TeX will close it automatically at exit. -     \immediate\openout\auxfile=\jobname.aux -   \fi % \openindices needs to do some work in any case. -   \openindices -   \let\setfilename=\comment % Ignore extra @setfilename cmds. -   % -   % If texinfo.cnf is present on the system, read it. -   % Useful for site-wide @afourpaper, etc. -   \openin 1 texinfo.cnf -   \ifeof 1 \else \input texinfo.cnf \fi -   \closein 1 -   % -   \comment % Ignore the actual filename. -} - -% Called from \setfilename. -% -\def\openindices{% -  \newindex{cp}% -  \newcodeindex{fn}% -  \newcodeindex{vr}% -  \newcodeindex{tp}% -  \newcodeindex{ky}% -  \newcodeindex{pg}% -} +% @setfilename INFO-FILENAME - ignored +\let\setfilename=\comment  % @bye.  \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} @@ -1249,14 +1065,94 @@ where each line of input produces a line of output.}  \newtoks\toksC  \newtoks\toksD  \newbox\boxA +\newbox\boxB  \newcount\countA  \newif\ifpdf  \newif\ifpdfmakepagedest +% +% For LuaTeX +% + +\newif\iftxiuseunicodedestname +\txiuseunicodedestnamefalse % For pdfTeX etc. + +\ifx\luatexversion\thisisundefined +\else +  % Use Unicode destination names +  \txiuseunicodedestnametrue +  % Escape PDF strings with converting UTF-16 from UTF-8 +  \begingroup +    \catcode`\%=12 +    \directlua{ +      function UTF16oct(str) +        tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377') +        for c in string.utfvalues(str) do +          if c < 0x10000 then +            tex.sprint( +              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. +                            string.char(0x5c) .. string.char(0x25) .. '03o', +                            (c / 256), (c % 256))) +          else +            c = c - 0x10000 +            local c_hi = c / 1024 + 0xd800 +            local c_lo = c % 1024 + 0xdc00 +            tex.sprint( +              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. +                            string.char(0x5c) .. string.char(0x25) .. '03o' .. +                            string.char(0x5c) .. string.char(0x25) .. '03o' .. +                            string.char(0x5c) .. string.char(0x25) .. '03o', +                            (c_hi / 256), (c_hi % 256), +                            (c_lo / 256), (c_lo % 256))) +          end +        end +      end +    } +  \endgroup +  \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}} +  % Escape PDF strings without converting +  \begingroup +    \directlua{ +      function PDFescstr(str) +        for c in string.bytes(str) do +          if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then +            tex.sprint( +              string.format(string.char(0x5c) .. string.char(0x25) .. '03o', +                            c)) +          else +            tex.sprint(string.char(c)) +          end +        end +      end +    } +  \endgroup +  \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}} +  \ifnum\luatexversion>84 +    % For LuaTeX >= 0.85 +    \def\pdfdest{\pdfextension dest} +    \let\pdfoutput\outputmode +    \def\pdfliteral{\pdfextension literal} +    \def\pdfcatalog{\pdfextension catalog} +    \def\pdftexversion{\numexpr\pdffeedback version\relax} +    \let\pdfximage\saveimageresource +    \let\pdfrefximage\useimageresource +    \let\pdflastximage\lastsavedimageresourceindex +    \def\pdfendlink{\pdfextension endlink\relax} +    \def\pdfoutline{\pdfextension outline} +    \def\pdfstartlink{\pdfextension startlink} +    \def\pdffontattr{\pdfextension fontattr} +    \def\pdfobj{\pdfextension obj} +    \def\pdflastobj{\numexpr\pdffeedback lastobj\relax} +    \let\pdfpagewidth\pagewidth +    \let\pdfpageheight\pageheight +    \edef\pdfhorigin{\pdfvariable horigin} +    \edef\pdfvorigin{\pdfvariable vorigin} +  \fi +\fi +  % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 -% can be set).  So we test for \relax and 0 as well as \undefined, -% borrowed from ifpdf.sty. -\ifx\pdfoutput\undefined +% can be set).  So we test for \relax and 0 as well as being undefined. +\ifx\pdfoutput\thisisundefined  \else    \ifx\pdfoutput\relax    \else @@ -1271,50 +1167,33 @@ where each line of input produces a line of output.}  % for display in the outlines, and in other places.  Thus, we have to  % double any backslashes.  Otherwise, a name like "\node" will be  % interpreted as a newline (\n), followed by o, d, e.  Not good. -% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html -% (and related messages, the final outcome is that it is up to the TeX -% user to double the backslashes and otherwise make the string valid, so -% that's what we do). - -% double active backslashes.  %  -{\catcode`\@=0 \catcode`\\=\active - @gdef@activebackslashdouble{% -   @catcode`@\=@active -   @let\=@doublebackslash} -} - -% To handle parens, we must adopt a different approach, since parens are -% not active characters.  hyperref.dtx (which has the same problem as -% us) handles it with this amazing macro to replace tokens, with minor -% changes for Texinfo.  It is included here under the GPL by permission -% from the author, Heiko Oberdiek. -%  -% #1 is the tokens to replace. -% #2 is the replacement. -% #3 is the control sequence with the string. -%  -\def\HyPsdSubst#1#2#3{% -  \def\HyPsdReplace##1#1##2\END{% -    ##1% -    \ifx\\##2\\% -    \else -      #2% -      \HyReturnAfterFi{% -        \HyPsdReplace##2\END -      }% -    \fi -  }% -  \xdef#3{\expandafter\HyPsdReplace#3#1\END}% +% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and +% related messages.  The final outcome is that it is up to the TeX user +% to double the backslashes and otherwise make the string valid, so +% that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to +% do this reliably, so we use it. + +% #1 is a control sequence in which to do the replacements, +% which we \xdef. +\def\txiescapepdf#1{% +  \ifx\pdfescapestring\thisisundefined +    % No primitive available; should we give a warning or log? +    % Many times it won't matter. +    \xdef#1{#1}% +  \else +    % The expandable \pdfescapestring primitive escapes parentheses, +    % backslashes, and other special chars. +    \xdef#1{\pdfescapestring{#1}}% +  \fi  } -\long\def\HyReturnAfterFi#1\fi{\fi#1} - -% #1 is a control sequence in which to do the replacements. -\def\backslashparens#1{% -  \xdef#1{#1}% redefine it as its expansion; the definition is simply -             % \lastnode when called from \setref -> \pdfmkdest. -  \HyPsdSubst{(}{\realbackslash(}{#1}% -  \HyPsdSubst{)}{\realbackslash)}{#1}% +\def\txiescapepdfutfsixteen#1{% +  \ifx\pdfescapestrutfsixteen\thisisundefined +    % No UTF-16 converting macro available. +    \txiescapepdf{#1}% +  \else +    \xdef#1{\pdfescapestrutfsixteen{#1}}% +  \fi  }  \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images @@ -1324,11 +1203,19 @@ output) for that.)}  \ifpdf    % -  % Color manipulation macros based on pdfcolor.tex. -  \def\cmykDarkRed{0.28 1 1 0.35} -  \def\cmykBlack{0 0 0 1} +  % Color manipulation macros using ideas from pdfcolor.tex, +  % except using rgb instead of cmyk; the latter is said to render as a +  % very dark gray on-screen and a very dark halftone in print, instead +  % of actual black. The dark red here is dark enough to print on paper as +  % nearly black, but still distinguishable for online viewing.  We use +  % black by default, though. +  \def\rgbDarkRed{0.50 0.09 0.12} +  \def\rgbBlack{0 0 0} +  % +  % rg sets the color for filling (usual text, etc.); +  % RG sets the color for stroking (thin rules, e.g., normal _'s). +  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}    % -  \def\pdfsetcolor#1{\pdfliteral{#1 k}}    % Set color, and create a mark which defines \thiscolor accordingly,    % so that \makeheadline knows which color to restore.    \def\setcolor#1{% @@ -1337,7 +1224,7 @@ output) for that.)}      \pdfsetcolor{#1}%    }    % -  \def\maincolor{\cmykBlack} +  \def\maincolor{\rgbBlack}    \pdfsetcolor{\maincolor}    \edef\thiscolor{\maincolor}    \def\lastcolordefs{} @@ -1367,32 +1254,34 @@ output) for that.)}    %    % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).    \def\dopdfimage#1#2#3{% -    \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% -    \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% +    \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% +    \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%      % -    % pdftex (and the PDF format) support .png, .jpg, .pdf (among -    % others).  Let's try in that order. +    % pdftex (and the PDF format) support .pdf, .png, .jpg (among +    % others).  Let's try in that order, PDF first since if +    % someone has a scalable image, presumably better to use that than a +    % bitmap.      \let\pdfimgext=\empty      \begingroup -      \openin 1 #1.png \ifeof 1 -        \openin 1 #1.jpg \ifeof 1 -          \openin 1 #1.jpeg \ifeof 1 -            \openin 1 #1.JPG \ifeof 1 -              \openin 1 #1.pdf \ifeof 1 -                \openin 1 #1.PDF \ifeof 1 +      \openin 1 #1.pdf \ifeof 1 +        \openin 1 #1.PDF \ifeof 1 +          \openin 1 #1.png \ifeof 1 +            \openin 1 #1.jpg \ifeof 1 +              \openin 1 #1.jpeg \ifeof 1 +                \openin 1 #1.JPG \ifeof 1                    \errhelp = \nopdfimagehelp                    \errmessage{Could not find image file #1 for pdf}% -                \else \gdef\pdfimgext{PDF}% +                \else \gdef\pdfimgext{JPG}%                  \fi -              \else \gdef\pdfimgext{pdf}% +              \else \gdef\pdfimgext{jpeg}%                \fi -            \else \gdef\pdfimgext{JPG}% +            \else \gdef\pdfimgext{jpg}%              \fi -          \else \gdef\pdfimgext{jpeg}% +          \else \gdef\pdfimgext{png}%            \fi -        \else \gdef\pdfimgext{jpg}% +        \else \gdef\pdfimgext{PDF}%          \fi -      \else \gdef\pdfimgext{png}% +      \else \gdef\pdfimgext{pdf}%        \fi        \closein 1      \endgroup @@ -1404,8 +1293,8 @@ output) for that.)}      \else        \immediate\pdfximage      \fi -      \ifdim \wd0 >0pt width \imagewidth \fi -      \ifdim \wd2 >0pt height \imageheight \fi +      \ifdim \wd0 >0pt width \pdfimagewidth \fi +      \ifdim \wd2 >0pt height \pdfimageheight \fi        \ifnum\pdftexversion<13           #1.\pdfimgext         \else @@ -1415,25 +1304,83 @@ output) for that.)}        \pdfrefximage \pdflastximage      \fi}    % -  \def\pdfmkdest#1{{% +  \def\setpdfdestname#1{{%      % We have to set dummies so commands such as @code, and characters      % such as \, aren't expanded when present in a section title.      \indexnofonts -    \turnoffactive -    \activebackslashdouble      \makevalueexpandable +    \turnoffactive +    \iftxiuseunicodedestname +      \ifx \declaredencoding \latone +        % Pass through Latin-1 characters. +        % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode. +      \else +        \ifx \declaredencoding \utfeight +          % Pass through Unicode characters. +        \else +          % Use ASCII approximations in destination names. +          \passthroughcharsfalse +        \fi +      \fi +    \else +      % Use ASCII approximations in destination names. +      \passthroughcharsfalse +    \fi      \def\pdfdestname{#1}% -    \backslashparens\pdfdestname -    \safewhatsit{\pdfdest name{\pdfdestname} xyz}% +    \txiescapepdf\pdfdestname +  }} +  % +  \def\setpdfoutlinetext#1{{% +    \indexnofonts +    \makevalueexpandable +    \turnoffactive +    \ifx \declaredencoding \latone +      % The PDF format can use an extended form of Latin-1 in bookmark +      % strings.  See Appendix D of the PDF Reference, Sixth Edition, for +      % the "PDFDocEncoding". +      \passthroughcharstrue +      % Pass through Latin-1 characters. +      %   LuaTeX: Convert to Unicode +      %   pdfTeX: Use Latin-1 as PDFDocEncoding +      \def\pdfoutlinetext{#1}% +    \else +      \ifx \declaredencoding \utfeight +        \ifx\luatexversion\thisisundefined +          % For pdfTeX  with UTF-8. +          % TODO: the PDF format can use UTF-16 in bookmark strings, +          % but the code for this isn't done yet. +          % Use ASCII approximations. +          \passthroughcharsfalse +          \def\pdfoutlinetext{#1}% +        \else +          % For LuaTeX with UTF-8. +          % Pass through Unicode characters for title texts. +          \passthroughcharstrue +          \def\pdfoutlinetext{#1}% +        \fi +      \else +        % For non-Latin-1 or non-UTF-8 encodings. +        % Use ASCII approximations. +        \passthroughcharsfalse +        \def\pdfoutlinetext{#1}% +      \fi +    \fi +    % LuaTeX: Convert to UTF-16 +    % pdfTeX: Use Latin-1 as PDFDocEncoding +    \txiescapepdfutfsixteen\pdfoutlinetext    }}    % +  \def\pdfmkdest#1{% +    \setpdfdestname{#1}% +    \safewhatsit{\pdfdest name{\pdfdestname} xyz}% +  } +  %    % used to mark target names; must be expandable.    \def\pdfmkpgn#1{#1}    % -  % by default, use a color that is dark enough to print on paper as -  % nearly black, but still distinguishable for online viewing. -  \def\urlcolor{\cmykDarkRed} -  \def\linkcolor{\cmykDarkRed} +  % by default, use black for everything. +  \def\urlcolor{\rgbBlack} +  \def\linkcolor{\rgbBlack}    \def\endlink{\setcolor{\maincolor}\pdfendlink}    %    % Adding outlines to PDF; macros for calculating structure of outlines @@ -1455,29 +1402,19 @@ output) for that.)}      % page number.  We could generate a destination for the section      % text in the case where a section has no node, but it doesn't      % seem worth the trouble, since most documents are normally structured. -    \def\pdfoutlinedest{#3}% -    \ifx\pdfoutlinedest\empty -      \def\pdfoutlinedest{#4}% -    \else -      % Doubled backslashes in the name. -      {\activebackslashdouble \xdef\pdfoutlinedest{#3}% -       \backslashparens\pdfoutlinedest}% +    \setpdfoutlinetext{#1} +    \setpdfdestname{#3} +    \ifx\pdfdestname\empty +      \def\pdfdestname{#4}%      \fi      % -    % Also double the backslashes in the display string. -    {\activebackslashdouble \xdef\pdfoutlinetext{#1}% -     \backslashparens\pdfoutlinetext}% -    % -    \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% +    \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%    }    %    \def\pdfmakeoutlines{%      \begingroup -      % Thanh's hack / proper braces in bookmarks -      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace -      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace -      %        % Read toc silently, to get counts of subentries for \pdfoutline. +      \def\partentry##1##2##3##4{}% ignore parts in the outlines        \def\numchapentry##1##2##3##4{%  	\def\thischapnum{##2}%  	\def\thissecnum{0}% @@ -1531,25 +1468,41 @@ output) for that.)}        % Latin 2 (0xea) gets translated to a | character.  Info from        % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.        % -      % xx to do this right, we have to translate 8-bit characters to -      % their "best" equivalent, based on the @documentencoding.  Right -      % now, I guess we'll just let the pdf reader have its way. +      % TODO this right, we have to translate 8-bit characters to +      % their "best" equivalent, based on the @documentencoding.  Too +      % much work for too little return.  Just use the ASCII equivalents +      % we use for the index sort strings. +      %         \indexnofonts        \setupdatafile +      % We can have normal brace characters in the PDF outlines, unlike +      % Texinfo index files.  So set that up. +      \def\{{\lbracecharliteral}% +      \def\}{\rbracecharliteral}%        \catcode`\\=\active \otherbackslash        \input \tocreadfilename      \endgroup    } +  {\catcode`[=1 \catcode`]=2 +   \catcode`{=\other \catcode`}=\other +   \gdef\lbracecharliteral[{]% +   \gdef\rbracecharliteral[}]% +  ]    %    \def\skipspaces#1{\def\PP{#1}\def\D{|}%      \ifx\PP\D\let\nextsp\relax      \else\let\nextsp\skipspaces -      \ifx\p\space\else\addtokens{\filename}{\PP}% -        \advance\filenamelength by 1 -      \fi +      \addtokens{\filename}{\PP}% +      \advance\filenamelength by 1      \fi      \nextsp} -  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} +  \def\getfilename#1{% +    \filenamelength=0 +    % If we don't expand the argument now, \skipspaces will get +    % snagged on things like "@value{foo}". +    \edef\temp{#1}% +    \expandafter\skipspaces\temp|\relax +  }    \ifnum\pdftexversion < 14      \let \startlink \pdfannotlink    \else @@ -1562,11 +1515,15 @@ output) for that.)}        % tried to figure out what each command should do in the context        % of @url.  for now, just make @/ a no-op, that's the only one        % people have actually reported a problem with. -      %  +      %        \normalturnoffactive        \def\@{@}%        \let\/=\empty        \makevalueexpandable +      % do we want to go so far as to use \indexnofonts instead of just +      % special-casing \var here? +      \def\var##1{##1}% +      %        \leavevmode\setcolor{\urlcolor}%        \startlink attr{/Border [0 0 0]}%          user{/Subtype /Link /A << /S /URI /URI (#1) >>}% @@ -1597,6 +1554,7 @@ output) for that.)}      \setcolor{\linkcolor}#1\endlink}    \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}  \else +  % non-pdf mode    \let\pdfmkdest = \gobble    \let\pdfurl = \gobble    \let\endlink = \relax @@ -1605,40 +1563,297 @@ output) for that.)}    \let\pdfmakeoutlines = \relax  \fi  % \ifx\pdfoutput - -\message{fonts,} - -% Change the current font style to #1, remembering it in \curfontstyle. -% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in -% italics, not bold italics.  % -\def\setfontstyle#1{% -  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. -  \csname ten#1\endcsname  % change the current font -} - -% Select #1 fonts with the current style. +% For XeTeX  % -\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} - -\def\rm{\fam=0 \setfontstyle{rm}} -\def\it{\fam=\itfam \setfontstyle{it}} -\def\sl{\fam=\slfam \setfontstyle{sl}} -\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} -\def\tt{\fam=\ttfam \setfontstyle{tt}} - -% Texinfo sort of supports the sans serif font style, which plain TeX does not. -% So we set up a \sf. -\newfam\sffam -\def\sf{\fam=\sffam \setfontstyle{sf}} -\let\li = \sf % Sometimes we call it \li, not \sf. - -% We don't need math for this font style. -\def\ttsl{\setfontstyle{ttsl}} +\ifx\XeTeXrevision\thisisundefined +\else +  % +  % XeTeX version check +  % +  \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1 +    % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307. +    % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941). +    % For avoiding PDF destination name replacement, we use this special +    % instead of xdvipdfmx's command line option `-C 0x0010'. +    \special{dvipdfmx:config C 0x0010} +    % XeTeX 0.99995+ comes with xdvipdfmx 20160307+. +    % It can handle Unicode destination names for PDF. +    \txiuseunicodedestnametrue +  \else +    % XeTeX < 0.99996 (TeX Live < 2016) cannot use the +    % `dvipdfmx:config' special. +    % So for avoiding PDF destination name replacement, +    % xdvipdfmx's command line option `-C 0x0010' is necessary. +    % +    % XeTeX < 0.99995 can not handle Unicode destination names for PDF +    % because xdvipdfmx 20150315 has a UTF-16 conversion issue. +    % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). +    \txiuseunicodedestnamefalse +  \fi +  % +  % Color support +  % +  \def\rgbDarkRed{0.50 0.09 0.12} +  \def\rgbBlack{0 0 0} +  % +  \def\pdfsetcolor#1{\special{pdf:scolor [#1]}} +  % +  % Set color, and create a mark which defines \thiscolor accordingly, +  % so that \makeheadline knows which color to restore. +  \def\setcolor#1{% +    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% +    \domark +    \pdfsetcolor{#1}% +  } +  % +  \def\maincolor{\rgbBlack} +  \pdfsetcolor{\maincolor} +  \edef\thiscolor{\maincolor} +  \def\lastcolordefs{} +  % +  \def\makefootline{% +    \baselineskip24pt +    \line{\pdfsetcolor{\maincolor}\the\footline}% +  } +  % +  \def\makeheadline{% +    \vbox to 0pt{% +      \vskip-22.5pt +      \line{% +        \vbox to8.5pt{}% +        % Extract \thiscolor definition from the marks. +        \getcolormarks +        % Typeset the headline with \maincolor, then restore the color. +        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% +      }% +      \vss +    }% +    \nointerlineskip +  } +  % +  % PDF outline support +  % +  % Emulate pdfTeX primitive +  \def\pdfdest name#1 xyz{% +    \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}% +  } +  % +  \def\setpdfdestname#1{{% +    % We have to set dummies so commands such as @code, and characters +    % such as \, aren't expanded when present in a section title. +    \indexnofonts +    \makevalueexpandable +    \turnoffactive +    \iftxiuseunicodedestname +      % Pass through Unicode characters. +    \else +      % Use ASCII approximations in destination names. +      \passthroughcharsfalse +    \fi +    \def\pdfdestname{#1}% +    \txiescapepdf\pdfdestname +  }} +  % +  \def\setpdfoutlinetext#1{{% +    \turnoffactive +    % Always use Unicode characters in title texts. +    \def\pdfoutlinetext{#1}% +    % For XeTeX, xdvipdfmx converts to UTF-16. +    % So we do not convert. +    \txiescapepdf\pdfoutlinetext +  }} +  % +  \def\pdfmkdest#1{% +    \setpdfdestname{#1}% +    \safewhatsit{\pdfdest name{\pdfdestname} xyz}% +  } +  % +  % by default, use black for everything. +  \def\urlcolor{\rgbBlack} +  \def\linkcolor{\rgbBlack} +  \def\endlink{\setcolor{\maincolor}\pdfendlink} +  % +  \def\dopdfoutline#1#2#3#4{% +    \setpdfoutlinetext{#1} +    \setpdfdestname{#3} +    \ifx\pdfdestname\empty +      \def\pdfdestname{#4}% +    \fi +    % +    \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A +      << /S /GoTo /D (\pdfdestname) >> >> }% +  } +  % +  \def\pdfmakeoutlines{% +    \begingroup +      % +      % For XeTeX, counts of subentries are not necessary. +      % Therefore, we read toc only once. +      % +      % We use node names as destinations. +      \def\partentry##1##2##3##4{}% ignore parts in the outlines +      \def\numchapentry##1##2##3##4{% +        \dopdfoutline{##1}{1}{##3}{##4}}% +      \def\numsecentry##1##2##3##4{% +        \dopdfoutline{##1}{2}{##3}{##4}}% +      \def\numsubsecentry##1##2##3##4{% +        \dopdfoutline{##1}{3}{##3}{##4}}% +      \def\numsubsubsecentry##1##2##3##4{% +        \dopdfoutline{##1}{4}{##3}{##4}}% +      % +      \let\appentry\numchapentry% +      \let\appsecentry\numsecentry% +      \let\appsubsecentry\numsubsecentry% +      \let\appsubsubsecentry\numsubsubsecentry% +      \let\unnchapentry\numchapentry% +      \let\unnsecentry\numsecentry% +      \let\unnsubsecentry\numsubsecentry% +      \let\unnsubsubsecentry\numsubsubsecentry% +      % +      % For XeTeX, xdvipdfmx converts strings to UTF-16. +      % Therefore, the encoding and the language may not be considered. +      % +      \indexnofonts +      \setupdatafile +      % We can have normal brace characters in the PDF outlines, unlike +      % Texinfo index files.  So set that up. +      \def\{{\lbracecharliteral}% +      \def\}{\rbracecharliteral}% +      \catcode`\\=\active \otherbackslash +      \input \tocreadfilename +    \endgroup +  } +  {\catcode`[=1 \catcode`]=2 +   \catcode`{=\other \catcode`}=\other +   \gdef\lbracecharliteral[{]% +   \gdef\rbracecharliteral[}]% +  ] + +  \special{pdf:docview << /PageMode /UseOutlines >> } +  % ``\special{pdf:tounicode ...}'' is not necessary +  % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it. +  % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315, +  % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings. +  % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). +% +  \def\skipspaces#1{\def\PP{#1}\def\D{|}% +    \ifx\PP\D\let\nextsp\relax +    \else\let\nextsp\skipspaces +      \addtokens{\filename}{\PP}% +      \advance\filenamelength by 1 +    \fi +    \nextsp} +  \def\getfilename#1{% +    \filenamelength=0 +    % If we don't expand the argument now, \skipspaces will get +    % snagged on things like "@value{foo}". +    \edef\temp{#1}% +    \expandafter\skipspaces\temp|\relax +  } +  % make a live url in pdf output. +  \def\pdfurl#1{% +    \begingroup +      % it seems we really need yet another set of dummies; have not +      % tried to figure out what each command should do in the context +      % of @url.  for now, just make @/ a no-op, that's the only one +      % people have actually reported a problem with. +      % +      \normalturnoffactive +      \def\@{@}% +      \let\/=\empty +      \makevalueexpandable +      % do we want to go so far as to use \indexnofonts instead of just +      % special-casing \var here? +      \def\var##1{##1}% +      % +      \leavevmode\setcolor{\urlcolor}% +      \special{pdf:bann << /Border [0 0 0] +        /Subtype /Link /A << /S /URI /URI (#1) >> >>}% +    \endgroup} +  \def\endlink{\setcolor{\maincolor}\special{pdf:eann}} +  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} +  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} +  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} +  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} +  \def\maketoks{% +    \expandafter\poptoks\the\toksA|ENDTOKS|\relax +    \ifx\first0\adn0 +    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 +    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 +    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 +    \else +      \ifnum0=\countA\else\makelink\fi +      \ifx\first.\let\next=\done\else +        \let\next=\maketoks +        \addtokens{\toksB}{\the\toksD} +        \ifx\first,\addtokens{\toksB}{\space}\fi +      \fi +    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +    \next} +  \def\makelink{\addtokens{\toksB}% +    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} +  \def\pdflink#1{% +    \special{pdf:bann << /Border [0 0 0] +      /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% +    \setcolor{\linkcolor}#1\endlink} +  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +% +  % +  % @image support +  % +  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). +  \def\doxeteximage#1#2#3{% +    \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% +    \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% +    % +    % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among +    % others).  Let's try in that order, PDF first since if +    % someone has a scalable image, presumably better to use that than a +    % bitmap. +    \let\xeteximgext=\empty +    \begingroup +      \openin 1 #1.pdf \ifeof 1 +        \openin 1 #1.PDF \ifeof 1 +          \openin 1 #1.png \ifeof 1 +            \openin 1 #1.jpg \ifeof 1 +              \openin 1 #1.jpeg \ifeof 1 +                \openin 1 #1.JPG \ifeof 1 +                  \errmessage{Could not find image file #1 for XeTeX}% +                \else \gdef\xeteximgext{JPG}% +                \fi +              \else \gdef\xeteximgext{jpeg}% +              \fi +            \else \gdef\xeteximgext{jpg}% +            \fi +          \else \gdef\xeteximgext{png}% +          \fi +        \else \gdef\xeteximgext{PDF}% +        \fi +      \else \gdef\xeteximgext{pdf}% +      \fi +      \closein 1 +    \endgroup +    % +    \def\xetexpdfext{pdf}% +    \ifx\xeteximgext\xetexpdfext +      \XeTeXpdffile "#1".\xeteximgext "" +    \else +      \def\xetexpdfext{PDF}% +      \ifx\xeteximgext\xetexpdfext +        \XeTeXpdffile "#1".\xeteximgext "" +      \else +        \XeTeXpicfile "#1".\xeteximgext "" +      \fi +    \fi +    \ifdim \wd0 >0pt width \xeteximagewidth \fi +    \ifdim \wd2 >0pt height \xeteximageheight \fi \relax +  } +\fi -% Default leading. -\newdimen\textleading  \textleading = 13.2pt +% +\message{fonts,}  % Set the baselineskip to #1, and the lineskip and strut size  % correspondingly.  There is no deep meaning behind these magic numbers @@ -1651,6 +1866,7 @@ output) for that.)}  % can get a sort of poor man's double spacing by redefining this.  \def\baselinefactor{1}  % +\newdimen\textleading  \def\setleading#1{%    \dimen0 = #1\relax    \normalbaselineskip = \baselinefactor\dimen0 @@ -1672,7 +1888,7 @@ output) for that.)}  % if we are producing pdf, and we have \pdffontattr, then define cmaps.  % (\pdffontattr was introduced many years ago, but people still run  % older pdftex's; it's easy to conditionalize, so we do.) -\ifpdf \ifx\pdffontattr\undefined \else +\ifpdf \ifx\pdffontattr\thisisundefined \else    \begingroup      \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.      \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap @@ -1923,28 +2139,34 @@ end  \fi\fi -% Set the font macro #1 to the font named #2, adding on the -% specified font prefix (normally `cm'). +% Set the font macro #1 to the font named \fontprefix#2.  % #3 is the font's design size, #4 is a scale factor, #5 is the CMap -% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass -% empty to omit). +% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). +% Example: +% #1 = \textrm +% #2 = \rmshape +% #3 = 10 +% #4 = \mainmagstep +% #5 = OT1 +%  \def\setfont#1#2#3#4#5{%    \font#1=\fontprefix#2#3 scaled #4    \csname cmap#5\endcsname#1%  }  % This is what gets called when #5 of \setfont is empty.  \let\cmap\gobble -% emacs-page end of cmaps +% +% (end of cmaps)  % Use cm as the default font prefix.  % To specify the font prefix, you must define \fontprefix  % before you read in texinfo.tex. -\ifx\fontprefix\undefined +\ifx\fontprefix\thisisundefined  \def\fontprefix{cm}  \fi  % Support font families that don't use the same naming scheme as CM.  \def\rmshape{r} -\def\rmbshape{bx}               %where the normal face is bold +\def\rmbshape{bx}               % where the normal face is bold  \def\bfshape{b}  \def\bxshape{bx}  \def\ttshape{tt} @@ -1959,9 +2181,8 @@ end  \def\scshape{csc}  \def\scbshape{csc} -% Definitions for a main text size of 11pt.  This is the default in -% Texinfo. -%  +% Definitions for a main text size of 11pt.  (The default in Texinfo.) +%  \def\definetextfontsizexi{%  % Text fonts (11.2pt, magstep1).  \def\textnominalsize{11pt} @@ -1981,8 +2202,10 @@ end  % A few fonts for @defun names and args.  \setfont\defbf\bfshape{10}{\magstep1}{OT1}  \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} +\setfont\defsl\slshape{10}{\magstep1}{OT1TT}  \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} +\def\df{\let\ttfont=\deftt \let\bffont = \defbf +\let\ttslfont=\defttsl \let\slfont=\defsl \bf}  % Fonts for indices, footnotes, small examples (9pt).  \def\smallnominalsize{9pt} @@ -2024,8 +2247,6 @@ end  \setfont\titlesc\scbshape{10}{\magstep4}{OT1}  \font\titlei=cmmi12 scaled \magstep3  \font\titlesy=cmsy10 scaled \magstep4 -\def\authorrm{\secrm} -\def\authortt{\sectt}  \def\titleecsize{2074}  % Chapter (and unnumbered) fonts (17.28pt). @@ -2045,6 +2266,7 @@ end  % Section fonts (14.4pt).  \def\secnominalsize{14pt}  \setfont\secrm\rmbshape{12}{\magstep1}{OT1} +\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}  \setfont\secit\itbshape{10}{\magstep2}{OT1IT}  \setfont\secsl\slbshape{10}{\magstep2}{OT1}  \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} @@ -2070,7 +2292,7 @@ end  \font\ssecsy=cmsy10 scaled 1315  \def\ssececsize{1200} -% Reduced fonts for @acro in text (10pt). +% Reduced fonts for @acronym in text (10pt).  \def\reducednominalsize{10pt}  \setfont\reducedrm\rmshape{10}{1000}{OT1}  \setfont\reducedtt\ttshape{10}{1000}{OT1TT} @@ -2084,17 +2306,17 @@ end  \font\reducedsy=cmsy10  \def\reducedecsize{1000} -% reset the current fonts -\textfonts +\textleading = 13.2pt % line spacing for 11pt CM +\textfonts            % reset the current fonts  \rm -} % end of 11pt text font size definitions +} % end of 11pt text font size definitions, \definetextfontsizexi  % Definitions to make the main text be 10pt Computer Modern, with  % section, chapter, etc., sizes following suit.  This is for the GNU  % Press printing of the Emacs 22 manual.  Maybe other manuals in the  % future.  Used with @smallbook, which sets the leading to 12pt. -%  +%  \def\definetextfontsizex{%  % Text fonts (10pt).  \def\textnominalsize{10pt} @@ -2114,8 +2336,10 @@ end  % A few fonts for @defun names and args.  \setfont\defbf\bfshape{10}{\magstephalf}{OT1}  \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} +\setfont\defsl\slshape{10}{\magstephalf}{OT1TT}  \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} -\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} +\def\df{\let\ttfont=\deftt \let\bffont = \defbf +\let\slfont=\defsl \let\ttslfont=\defttsl \bf}  % Fonts for indices, footnotes, small examples (9pt).  \def\smallnominalsize{9pt} @@ -2157,8 +2381,6 @@ end  \setfont\titlesc\scbshape{10}{\magstep4}{OT1}  \font\titlei=cmmi12 scaled \magstep3  \font\titlesy=cmsy10 scaled \magstep4 -\def\authorrm{\secrm} -\def\authortt{\sectt}  \def\titleecsize{2074}  % Chapter fonts (14.4pt). @@ -2185,7 +2407,7 @@ end  \setfont\secsf\sfbshape{12}{1000}{OT1}  \let\secbf\secrm  \setfont\secsc\scbshape{10}{\magstep1}{OT1} -\font\seci=cmmi12  +\font\seci=cmmi12  \font\secsy=cmsy10 scaled \magstep1  \def\sececsize{1200} @@ -2203,7 +2425,7 @@ end  \font\ssecsy=cmsy10  \def\ssececsize{1000} -% Reduced fonts for @acro in text (9pt). +% Reduced fonts for @acronym in text (9pt).  \def\reducednominalsize{9pt}  \setfont\reducedrm\rmshape{9}{1000}{OT1}  \setfont\reducedtt\ttshape{9}{1000}{OT1TT} @@ -2217,29 +2439,34 @@ end  \font\reducedsy=cmsy9  \def\reducedecsize{0900} -% reduce space between paragraphs -\divide\parskip by 2 - -% reset the current fonts -\textfonts +\divide\parskip by 2  % reduce space between paragraphs +\textleading = 12pt   % line spacing for 10pt CM +\textfonts            % reset the current fonts  \rm -} % end of 10pt text font size definitions +} % end of 10pt text font size definitions, \definetextfontsizex + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000}{OT1} +\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12 +\setfont\shortcontsl\slshape{12}{1000}{OT1} +\setfont\shortconttt\ttshape{12}{1000}{OT1TT}  % We provide the user-level command  %   @fonttextsize 10  % (or 11) to redefine the text font size.  pt is assumed. -%  -\def\xword{10} +%  \def\xiword{11} +\def\xword{10} +\def\xwordpt{10pt}  %  \parseargdef\fonttextsize{%    \def\textsizearg{#1}% -  \wlog{doing @fonttextsize \textsizearg}% +  %\wlog{doing @fonttextsize \textsizearg}%    %    % Set \globaldefs so that documents can use this inside @tex, since    % makeinfo 4.8 does not support it, but we need it nonetheless. -  %  +  %   \begingroup \globaldefs=1    \ifx\textsizearg\xword \definetextfontsizex    \else \ifx\textsizearg\xiword \definetextfontsizexi @@ -2250,96 +2477,115 @@ end   \endgroup  } +% +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% +  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. +  \csname #1font\endcsname  % change the current font +} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} +  % In order for the font changes to affect most math symbols and letters, -% we have to define the \textfont of the standard families.  Since -% texinfo doesn't allow for producing subscripts and superscripts except -% in the main text, we don't bother to reset \scriptfont and -% \scriptscriptfont (which would also require loading a lot more fonts). +% we have to define the \textfont of the standard families.  We don't +% bother to reset \scriptfont and \scriptscriptfont; awaiting user need.  %  \def\resetmathfonts{% -  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy -  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf -  \textfont\ttfam=\tentt \textfont\sffam=\tensf +  \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont +  \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont +  \textfont\ttfam=\ttfont \textfont\sffam=\sffont  } -% The font-changing commands redefine the meanings of \tenSTYLE, 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 -% \tenSTYLE to set the current font. +% + +% 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.  %  % Each font-changing command also sets the names \lsize (one size lower) -% and \lllsize (three sizes lower).  These relative commands are used in -% the LaTeX logo and acronyms. +% and \lllsize (three sizes lower).  These relative commands are used +% in, e.g., the LaTeX logo and acronyms.  %  % This all needs generalizing, badly.  % -\def\textfonts{% -  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl -  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc -  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy -  \let\tenttsl=\textttsl -  \def\curfontsize{text}% -  \def\lsize{reduced}\def\lllsize{smaller}% -  \resetmathfonts \setleading{\textleading}} -\def\titlefonts{% -  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl -  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc -  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy -  \let\tenttsl=\titlettsl -  \def\curfontsize{title}% -  \def\lsize{chap}\def\lllsize{subsec}% -  \resetmathfonts \setleading{25pt}} + +\def\assignfonts#1{% +  \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 + +% Select smaller font size with the current style.  Used to change font size +% in, e.g., the LaTeX logo and acronyms.  If we are using bold fonts for +% normal roman text, also use bold fonts for roman text in the smaller size. +\def\switchtolllsize{% +   \expandafter\assignfonts\expandafter{\lllsize}% +   \ifrmisbold +     \let\rmfont\bffont +   \fi +   \csname\curfontstyle\endcsname +}% + +\def\switchtolsize{% +   \expandafter\assignfonts\expandafter{\lsize}% +   \ifrmisbold +     \let\rmfont\bffont +   \fi +   \csname\curfontstyle\endcsname +}% + +\def\definefontsetatsize#1#2#3#4#5{% +\expandafter\def\csname #1fonts\endcsname{% +  \def\curfontsize{#1}% +  \def\lsize{#2}\def\lllsize{#3}% +  \csname rmisbold#5\endcsname +  \assignfonts{#1}% +  \resetmathfonts +  \setleading{#4}% +}} + +\definefontsetatsize{text}   {reduced}{smaller}{\textleading}{false} +\definefontsetatsize{title}  {chap}   {subsec} {27pt}  {true} +\definefontsetatsize{chap}   {sec}    {text}   {19pt}  {true} +\definefontsetatsize{sec}    {subsec} {reduced}{17pt}  {true} +\definefontsetatsize{ssec}   {text}   {small}  {15pt}  {true} +\definefontsetatsize{reduced}{small}  {smaller}{10.5pt}{false} +\definefontsetatsize{small}  {smaller}{smaller}{10.5pt}{false} +\definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false} +  \def\titlefont#1{{\titlefonts\rm #1}} -\def\chapfonts{% -  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl -  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc -  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy -  \let\tenttsl=\chapttsl -  \def\curfontsize{chap}% -  \def\lsize{sec}\def\lllsize{text}% -  \resetmathfonts \setleading{19pt}} -\def\secfonts{% -  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl -  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc -  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy -  \let\tenttsl=\secttsl -  \def\curfontsize{sec}% -  \def\lsize{subsec}\def\lllsize{reduced}% -  \resetmathfonts \setleading{16pt}} -\def\subsecfonts{% -  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl -  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc -  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy -  \let\tenttsl=\ssecttsl -  \def\curfontsize{ssec}% -  \def\lsize{text}\def\lllsize{small}% -  \resetmathfonts \setleading{15pt}} -\let\subsubsecfonts = \subsecfonts -\def\reducedfonts{% -  \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl -  \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc -  \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy -  \let\tenttsl=\reducedttsl -  \def\curfontsize{reduced}% -  \def\lsize{small}\def\lllsize{smaller}% -  \resetmathfonts \setleading{10.5pt}} -\def\smallfonts{% -  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl -  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc -  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy -  \let\tenttsl=\smallttsl -  \def\curfontsize{small}% -  \def\lsize{smaller}\def\lllsize{smaller}% -  \resetmathfonts \setleading{10.5pt}} -\def\smallerfonts{% -  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl -  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc -  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy -  \let\tenttsl=\smallerttsl -  \def\curfontsize{smaller}% -  \def\lsize{smaller}\def\lllsize{smaller}% -  \resetmathfonts \setleading{9.5pt}} +\let\subsecfonts = \ssecfonts +\let\subsubsecfonts = \ssecfonts + +% Define these just so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$}  % Set the fonts to use with the @small... environments.  \let\smallexamplefonts = \smallfonts @@ -2354,53 +2600,215 @@ end  %  % By the way, for comparison, here's what fits with @example (10pt):  %   8.5x11=71  smallbook=60  a4=75  a5=58 -% -% I wish the USA used A4 paper.  % --karl, 24jan03. -  % Set up the default fonts, so we can use them for creating boxes.  %  \definetextfontsizexi -% Define these so they can be easily changed for other fonts. -\def\angleleft{$\langle$} -\def\angleright{$\rangle$} + +\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. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% 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 and the set of \ifmarkupSTYLE switches for all styles +% currently in effect. +\newif\ifmarkupvar +\newif\ifmarkupsamp +\newif\ifmarkupkey +%\newif\ifmarkupfile % @file == @samp. +%\newif\ifmarkupoption % @option == @samp. +\newif\ifmarkupcode +\newif\ifmarkupkbd +%\newif\ifmarkupenv % @env == @code. +%\newif\ifmarkupcommand % @command == @code. +\newif\ifmarkuptex % @tex (and part of @math, for now). +\newif\ifmarkupexample +\newif\ifmarkupverb +\newif\ifmarkupverbatim + +\let\currentmarkupstyle\empty + +\def\setupmarkupstyle#1{% +  \csname markup#1true\endcsname +  \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\markupsetuplqdefault{\let`\lq} +\gdef\markupsetuprqdefault{\let'\rq} + +\gdef\markupsetcodequoteleft{\let`\codequoteleft} +\gdef\markupsetcodequoteright{\let'\codequoteright} +} + +\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{% +  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax +    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax +      '% +    \else \char'15 \fi +  \else \char'15 \fi +} +% +% 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{% +  \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 +} + +% Commands to set the quote options. +%  +\parseargdef\codequoteundirected{% +  \def\temp{#1}% +  \ifx\temp\onword +    \expandafter\let\csname SETtxicodequoteundirected\endcsname +      = t% +  \else\ifx\temp\offword +    \expandafter\let\csname SETtxicodequoteundirected\endcsname +      = \relax +  \else +    \errhelp = \EMsimple +    \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% +  \fi\fi +} +% +\parseargdef\codequotebacktick{% +  \def\temp{#1}% +  \ifx\temp\onword +    \expandafter\let\csname SETtxicodequotebacktick\endcsname +      = t% +  \else\ifx\temp\offword +    \expandafter\let\csname SETtxicodequotebacktick\endcsname +      = \relax +  \else +    \errhelp = \EMsimple +    \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% +  \fi\fi +} + +% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. +\def\noligaturesquoteleft{\relax\lq}  % Count depth in font-changes, for error checks  \newcount\fontdepth \fontdepth=0 -% Fonts for short table of contents. -\setfont\shortcontrm\rmshape{12}{1000}{OT1} -\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12 -\setfont\shortcontsl\slshape{12}{1000}{OT1} -\setfont\shortconttt\ttshape{12}{1000}{OT1TT} +% Font commands. -%% Add scribe-like font environments, plus @l for inline lisp (usually sans -%% serif) and @ii for TeX italic +% #1 is the font command (\sl or \it), #2 is the text to slant. +% If we are in a monospaced environment, however, 1) always use \ttsl, +% and 2) do not add an italic correction. +\def\dosmartslant#1#2{% +  \ifusingtt  +    {{\ttsl #2}\let\next=\relax}% +    {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% +  \next +} +\def\smartslanted{\dosmartslant\sl} +\def\smartitalic{\dosmartslant\it} -% \smartitalic{ARG} outputs arg in italics, followed by an italic correction -% unless the following character is such as not to need one. -\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else -                    \ptexslash\fi\fi\fi} -\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} -\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} +% Output an italic correction unless \next (presumed to be the following +% character) is such as not to need one. +\def\smartitaliccorrection{% +  \ifx\next,% +  \else\ifx\next-% +  \else\ifx\next.% +  \else\ifx\next\.% +  \else\ifx\next\comma% +  \else\ptexslash +  \fi\fi\fi\fi\fi +  \aftersmartic +} -% like \smartslanted except unconditionally uses \ttsl. -% @var is set to this for defun arguments. -\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} +% Unconditional use \ttsl, and no ic.  @var is set to this for defuns. +\def\ttslanted#1{{\ttsl #1}} -% like \smartslanted except unconditionally use \sl.  We never want +% @cite is like \smartslanted except unconditionally use \sl.  We never want  % ttsl for book titles, do we? -\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} +\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} + +\def\aftersmartic{} +\def\var#1{% +  \let\saveaftersmartic = \aftersmartic +  \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% +  \smartslanted{#1}% +}  \let\i=\smartitalic  \let\slanted=\smartslanted -\let\var=\smartslanted  \let\dfn=\smartslanted  \let\emph=\smartitalic -% @b, explicit bold. +% 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 + +% @b, explicit bold.  Also @strong.  \def\b#1{{\bf #1}}  \let\strong=\b @@ -2420,8 +2828,8 @@ end  %  \catcode`@=11    \def\plainfrenchspacing{% -    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m -    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m +    \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m +    \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m      \def\endofsentencespacefactor{1000}% for @. and friends    }    \def\plainnonfrenchspacing{% @@ -2432,30 +2840,21 @@ end  \catcode`@=\other  \def\endofsentencespacefactor{3000}% default +% @t, explicit typewriter.  \def\t#1{%    {\tt \rawbackslash \plainfrenchspacing #1}%    \null  } -\def\samp#1{`\tclose{#1}'\null} -\setfont\keyrm\rmshape{8}{1000}{OT1} -\font\keysy=cmsy9 -\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% -  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% -    \vbox{\hrule\kern-0.4pt -     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% -    \kern-0.4pt\hrule}% -  \kern-.06em\raise0.4pt\hbox{\angleright}}}} -\def\key #1{{\nohyphenation \uppercase{#1}}\null} -% The old definition, with no lozenge: -%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} -\def\ctrl #1{{\tt \rawbackslash \hat}#1} - -% @file, @option are the same as @samp. -\let\file=\samp -\let\option=\samp - -% @code is a modification of @t, -% which makes spaces the same size as normal in the surrounding text. + +% @samp. +\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} + +% @indicateurl is \samp, that is, with quotes. +\let\indicateurl=\samp + +% @code (and similar) prints in typewriter, but with spaces the same +% size as normal in the surrounding text, without hyphenation, etc. +% This is a subroutine for that.  \def\tclose#1{%    {%      % Change normal interword space to be same as for the current font. @@ -2474,40 +2873,63 @@ end      \plainfrenchspacing      #1%    }% -  \null +  \null % reset spacefactor to 1000  }  % 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. - +%  % 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. +% 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 -    \catcode\rquoteChar=\active \catcode\lquoteChar=\active -    \let'\codequoteright \let`\codequoteleft -    % +    \setupmarkupstyle{code}% +    % The following should really be moved into \setupmarkupstyle handlers.      \catcode\dashChar=\active  \catcode\underChar=\active      \ifallowcodebreaks       \let-\codedash       \let_\codeunder      \else -     \let-\realdash +     \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    } +  % +  \gdef\codedash{\futurelet\next\codedashfinish} +  \gdef\codedashfinish{% +    \normaldash % always output the dash character itself. +    %  +    % Now, output a discretionary to allow a line break, unless +    % (a) the next character is a -, or +    % (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\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\codedashprev= \next +  }  } +\def\normaldash{-} +% +\def\codex #1{\tclose{#1}\endgroup} -\def\realdash{-} -\def\codedash{-\discretionary{}{}{}}  \def\codeunder{%    % this is all so @math{@code{var_name}+1} can work.  In math mode, _    % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) @@ -2519,13 +2941,12 @@ end               \discretionary{}{}{}}%              {\_}%  } -\def\codex #1{\tclose{#1}\endgroup}  % An additional complication: the above will allow breaks after, e.g., -% each of the four underscores in __typeof__.  This is undesirable in -% some manuals, especially if they don't have long identifiers in -% general.  @allowcodebreaks provides a way to control this. -%  +% each of the four underscores in __typeof__.  This is bad. +% @allowcodebreaks provides a document-level way to turn breaking at - +% and _ on and off. +%  \newif\ifallowcodebreaks  \allowcodebreakstrue  \def\keywordtrue{true} @@ -2539,82 +2960,148 @@ end      \allowcodebreaksfalse    \else      \errhelp = \EMsimple -    \errmessage{Unknown @allowcodebreaks option `\txiarg'}% +    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%    \fi\fi  } -% @kbd is like @code, except that if the argument is just one @key command, -% then @kbd has no effect. - -% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), -%   `example' (@kbd uses ttsl only inside of @example and friends), -%   or `code' (@kbd uses normal tty font always). -\parseargdef\kbdinputstyle{% -  \def\txiarg{#1}% -  \ifx\txiarg\worddistinct -    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% -  \else\ifx\txiarg\wordexample -    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% -  \else\ifx\txiarg\wordcode -    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% -  \else -    \errhelp = \EMsimple -    \errmessage{Unknown @kbdinputstyle option `\txiarg'}% -  \fi\fi\fi -} -\def\worddistinct{distinct} -\def\wordexample{example} -\def\wordcode{code} - -% Default is `distinct.' -\kbdinputstyle distinct - -\def\xkey{\key} -\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% -\ifx\one\xkey\ifx\threex\three \key{#2}% -\else{\tclose{\kbdfont\look}}\fi -\else{\tclose{\kbdfont\look}}\fi} - -% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. -\let\indicateurl=\code -\let\env=\code +% For @command, @env, @file, @option quotes seem unnecessary, +% so use \code rather than \samp.  \let\command=\code - -% @clicksequence{File @click{} Open ...} -\def\clicksequence#1{\begingroup #1\endgroup} - -% @clickstyle @arrow   (by default) -\parseargdef\clickstyle{\def\click{#1}} -\def\click{\arrow} - -% @uref (abbreviation for `urlref') takes an optional (comma-separated) -% second argument specifying the text to display and an optional third -% arg as text to display instead of (rather than in addition to) the url -% itself.  First (mandatory) arg is the url.  Perhaps eventually put in -% a hypertex \special here. -% -\def\uref#1{\douref #1,,,\finish} -\def\douref#1,#2,#3,#4\finish{\begingroup +\let\env=\code +\let\file=\code +\let\option=\code + +% @uref (abbreviation for `urlref') aka @url takes an optional +% (comma-separated) second argument specifying the text to display and +% an optional third arg as text to display instead of (rather than in +% addition to) the url itself.  First (mandatory) arg is the url. + +% TeX-only option to allow changing PDF output to show only the second +% arg (if given), and not the url (which is then just the link target). +\newif\ifurefurlonlylink + +% The main macro is \urefbreak, which allows breaking at expected +% 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} +\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example    \unsepspaces    \pdfurl{#1}%    \setbox0 = \hbox{\ignorespaces #3}%    \ifdim\wd0 > 0pt      \unhbox0 % third arg given, show only that    \else -    \setbox0 = \hbox{\ignorespaces #2}% +    \setbox0 = \hbox{\ignorespaces #2}% look for second arg      \ifdim\wd0 > 0pt        \ifpdf -        \unhbox0             % PDF: 2nd arg given, show only it +        % For pdfTeX and LuaTeX +        \ifurefurlonlylink +          % PDF plus option to not display url, show just arg +          \unhbox0              +        \else +          % PDF, normally display both arg and url for consistency, +          % visibility, if the pdf is eventually used to print, etc. +          \unhbox0\ (\urefcode{#1})% +        \fi        \else -        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url +        \ifx\XeTeXrevision\thisisundefined +          \unhbox0\ (\urefcode{#1})% DVI, always show arg and url +        \else +          % For XeTeX +          \ifurefurlonlylink +            % PDF plus option to not display url, show just arg +            \unhbox0              +          \else +            % PDF, normally display both arg and url for consistency, +            % visibility, if the pdf is eventually used to print, etc. +            \unhbox0\ (\urefcode{#1})% +          \fi +        \fi        \fi      \else -      \code{#1}% only url given, so show it +      \urefcode{#1}% only url given, so show it      \fi    \fi    \endlink  \endgroup} +% Allow line breaks around only a few characters (only). +\def\urefcatcodes{% +  \catcode`\&=\active \catcode`\.=\active +  \catcode`\#=\active \catcode`\?=\active +  \catcode`\/=\active +} +{ +  \urefcatcodes +  % +  \global\def\urefcode{\begingroup +    \setupmarkupstyle{code}% +    \urefcatcodes +    \let&\urefcodeamp +    \let.\urefcodedot +    \let#\urefcodehash +    \let?\urefcodequest +    \let/\urefcodeslash +    \codex +  } +  % +  % By default, they are just regular characters. +  \global\def&{\normalamp} +  \global\def.{\normaldot} +  \global\def#{\normalhash} +  \global\def?{\normalquest} +  \global\def/{\normalslash} +} + +% we put a little stretch before and after the breakable chars, to help +% line breaking of long url's.  The unequal skips make look better in +% cmtt at least, especially for dots. +\def\urefprestretchamount{.13em} +\def\urefpoststretchamount{.1em} +\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax} +\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax} +% +\def\urefcodeamp{\urefprestretch \&\urefpoststretch} +\def\urefcodedot{\urefprestretch .\urefpoststretch} +\def\urefcodehash{\urefprestretch \#\urefpoststretch} +\def\urefcodequest{\urefprestretch ?\urefpoststretch} +\def\urefcodeslash{\futurelet\next\urefcodeslashfinish} +{ +  \catcode`\/=\active +  \global\def\urefcodeslashfinish{% +    \urefprestretch \slashChar +    % Allow line break only after the final / in a sequence of +    % slashes, to avoid line break between the slashes in http://. +    \ifx\next/\else \urefpoststretch \fi +  } +} + +% One more complication: by default we'll break after the special +% characters, but some people like to break before the special chars, so +% allow that.  Also allow no breaking at all, for manual control. +%  +\parseargdef\urefbreakstyle{% +  \def\txiarg{#1}% +  \ifx\txiarg\wordnone +    \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} +  \else\ifx\txiarg\wordbefore +    \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} +  \else\ifx\txiarg\wordafter +    \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} +  \else +    \errhelp = \EMsimple +    \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% +  \fi\fi\fi +} +\def\wordafter{after} +\def\wordbefore{before} +\def\wordnone{none} + +\urefbreakstyle after +  % @url synonym for @uref, since that's how everyone uses it.  %  \let\url=\uref @@ -2633,49 +3120,103 @@ end      \endlink    \endgroup}  \else -  \let\email=\uref +  \ifx\XeTeXrevision\thisisundefined +    \let\email=\uref +  \else +    \def\email#1{\doemail#1,,\finish} +    \def\doemail#1,#2,#3\finish{\begingroup +      \unsepspaces +      \pdfurl{mailto:#1}% +      \setbox0 = \hbox{\ignorespaces #2}% +      \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi +      \endlink +    \endgroup} +  \fi  \fi -% 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. -% -\def\ifmonospace{\ifdim\fontdimen3\font=0pt } +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +%   `example' (@kbd uses ttsl only inside of @example and friends), +%   or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% +  \def\txiarg{#1}% +  \ifx\txiarg\worddistinct +    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% +  \else\ifx\txiarg\wordexample +    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% +  \else\ifx\txiarg\wordcode +    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% +  \else +    \errhelp = \EMsimple +    \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% +  \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct'. +\kbdinputstyle distinct + +% @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. +%\setfont\keyrm\rmshape{8}{1000}{OT1} +%\font\keysy=cmsy9 +%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% +%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% +%    \vbox{\hrule\kern-0.4pt +%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% +%    \kern-0.4pt\hrule}% +%  \kern-.06em\raise0.4pt\hbox{\angleright}}}} + +% 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} + +% @clickstyle @arrow   (by default) +\parseargdef\clickstyle{\def\click{#1}} +\def\click{\arrow}  % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the  % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.  %  \def\dmn#1{\thinspace #1} -\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} - -% @l was never documented to mean ``switch to the Lisp font'', -% and it is not used as such in any manual I can find.  We need it for -% Polish suppressed-l.  --karl, 22sep96. -%\def\l#1{{\li #1}\null} - -% 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 -  % @acronym for "FBI", "NATO", and the like.  % We print this one point size smaller, since it's intended for  % all-uppercase. -%  +%  \def\acronym#1{\doacronym #1,,\finish}  \def\doacronym#1,#2,#3\finish{% -  {\selectfonts\lsize #1}% +  {\switchtolsize #1}%    \def\temp{#2}%    \ifx\temp\empty \else      \space ({\unsepspaces \ignorespaces \temp \unskip})%    \fi +  \null % reset \spacefactor=1000  }  % @abbr for "Comput. J." and the like.  % No font change, but don't do end-of-sentence spacing. -%  +%  \def\abbr#1{\doabbr #1,,\finish}  \def\doabbr#1,#2,#3\finish{%    {\plainfrenchspacing #1}% @@ -2683,8 +3224,288 @@ end    \ifx\temp\empty \else      \space ({\unsepspaces \ignorespaces \temp \unskip})%    \fi +  \null % reset \spacefactor=1000 +} + +% @asis just yields its argument.  Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}.  So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ +  \catcode`\_ = \active +  \gdef\mathunderscore{% +    \catcode`\_=\active +    \def_{\ifnum\fam=\slfam \_\else\sb\fi}% +  } +} +% Another complication: we want \\ (and @\) to output a math (or tt) \. +% FYI, plain.tex uses \\ as a temporary control sequence (for no +% particular reason), but this is not advertised and we don't care. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% +  \ifmmode\else % only go into math if not in math mode already +    \tex +    \mathunderscore +    \let\\ = \mathbackslash +    \mathactive +    % make the texinfo accent commands work in math mode +    \let\"=\ddot +    \let\'=\acute +    \let\==\bar +    \let\^=\hat +    \let\`=\grave +    \let\u=\breve +    \let\v=\check +    \let\~=\tilde +    \let\dotaccent=\dot +    % have to provide another name for sup operator +    \let\mathopsup=\sup +  $\expandafter\finishmath\fi +} +\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ +  \catcode`^ = \active +  \catcode`< = \active +  \catcode`> = \active +  \catcode`+ = \active +  \catcode`' = \active +  \gdef\mathactive{% +    \let^ = \ptexhat +    \let< = \ptexless +    \let> = \ptexgtr +    \let+ = \ptexplus +    \let' = \ptexquoteright +  } +} + +% for @sub and @sup, if in math mode, just do a normal sub/superscript. +% If in text, use math to place as sub/superscript, but switch +% into text mode, with smaller fonts.  This is a different font than the +% one used for real math sub/superscripts (8pt vs. 7pt), but let's not +% fix it (significant additions to font machinery) until someone notices. +% +\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} +\def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}% +% +\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} +\def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}% + +% @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. +%  +\def\outfmtnametex{tex} +% +\long\def\inlinefmt#1{\doinlinefmt #1,\finish} +\long\def\doinlinefmt#1,#2,\finish{% +  \def\inlinefmtname{#1}% +  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi +} +%  +% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if +% FMTNAME is tex, else ELSE-TEXT. +\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} +\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% +  \def\inlinefmtname{#1}% +  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi +} +% +% For raw, must switch into @tex before parsing the argument, to avoid +% setting catcodes prematurely.  Doing it this way means that, for +% example, @inlineraw{html, foo{bar} gets a parse error instead of being +% ignored.  But this isn't important because if people want a literal +% *right* brace they would have to use a command anyway, so they may as +% well use a command to get a left brace too.  We could re-use the +% delimiter character idea from \verb, but it seems like overkill. +%  +\long\def\inlineraw{\tex \doinlineraw} +\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} +\def\doinlinerawtwo#1,#2,\finish{% +  \def\inlinerawname{#1}% +  \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi +  \endgroup % close group opened by \tex. +} + +% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. +% +\long\def\inlineifset#1{\doinlineifset #1,\finish} +\long\def\doinlineifset#1,#2,\finish{% +  \def\inlinevarname{#1}% +  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax +  \else\ignorespaces#2\fi +} + +% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. +% +\long\def\inlineifclear#1{\doinlineifclear #1,\finish} +\long\def\doinlineifclear#1,#2,\finish{% +  \def\inlinevarname{#1}% +  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi +} + + +\message{glyphs,} +% and logos. + +% @@ prints an @, as does @atchar{}. +\def\@{\char64 } +\let\atchar=\@ + +% @{ @} @lbracechar{} @rbracechar{} all generate brace characters. +\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}} +\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}} +\let\{=\lbracechar +\let\}=\rbracechar + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \ptexc +\let\dotaccent = \ptexdot +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \ptext +\let\ubaraccent = \ptexb +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% +  \def\temp{#1}% +  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi +  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi +  \else \errmessage{@dotless can be used only with i or j}% +  \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence.  (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=1000 } + +% @LaTeX{} logo.  Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% +  L\kern-.36em +  {\setbox0=\hbox{T}% +   \vbox to \ht0{\hbox{% +     \ifx\textnominalsize\xwordpt +       % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX. +       % Revert to plain's \scriptsize, which is 7pt. +       \count255=\the\fam $\fam\count255 \scriptstyle A$% +     \else +       % For 11pt, we can use our lllsize. +       \switchtolllsize A% +     \fi +     }% +     \vss +  }}% +  \kern-.15em +  \TeX +} + +% Some math mode symbols.  Define \ensuremath to switch into math mode +% unless we are already there.  Expansion tricks may not be needed here, +% but safer, and can't hurt. +\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} +\def\ensuredmath#1{$\relax#1$} +% +\def\bullet{\ensuremath\ptexbullet} +\def\geq{\ensuremath\ge} +\def\leq{\ensuremath\le} +\def\minus{\ensuremath-} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in the cm +% typewriter fonts as three actual period characters; on the other hand, +% in other typewriter fonts three periods are wider than 1.5em.  So do +% whichever is larger. +% +\def\dots{% +  \leavevmode +  \setbox0=\hbox{...}% get width of three periods +  \ifdim\wd0 > 1.5em +    \dimen0 = \wd0 +  \else +    \dimen0 = 1.5em +  \fi +  \hbox to \dimen0{% +    \hskip 0pt plus.25fil +    .\hskip 0pt plus1fil +    .\hskip 0pt plus1fil +    .\hskip 0pt plus.5fil +  }%  } +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% +  \dots +  \spacefactor=\endofsentencespacefactor +} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, they should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} +\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\ttfont \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil +   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. +   \advance\hsize by -2\dimen2 % Rules. +   \vbox{% +      \hrule height\dimen2 +      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text. +         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. +         \kern3pt\vrule width\dimen2}% Space to right. +      \hrule height\dimen2} +    \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} +  % @pounds{} is a sterling sign, which Knuth put in the CM italic font.  %  \def\pounds{{\it\$}} @@ -2694,52 +3515,59 @@ end  % Theiling, which support regular, slanted, bold and bold slanted (and  % "outlined" (blackboard board, sort of) versions, which we don't need).  % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. -%  +%  % Although only regular is the truly official Euro symbol, we ignore  % that.  The Euro is designed to be slightly taller than the regular  % font height. -%  +%  % feymr - regular  % feymo - slanted  % feybr - bold  % feybo - bold slanted -%  +%  % There is no good (free) typewriter version, to my knowledge.  % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.  % Hmm. -%  +%  % Also doesn't work in math.  Do we need to do math with euro symbols?  % Hope not. -%  -%  +% +%  \def\euro{{\eurofont e}}  \def\eurofont{%    % We set the font at each command, rather than predefining it in    % \textfonts and the other font-switching commands, so that    % installations which never need the symbol don't have to have the    % font installed. -  %  +  %    % There is only one designed size (nominal 10pt), so we always scale    % that to the current nominal size. -  %  +  %    % By the way, simply using "at 1em" works for cmr10 and the like, but    % does not work for cmbx10 and other extended/shrunken fonts. -  %  +  %    \def\eurosize{\csname\curfontsize nominalsize\endcsname}%    % -  \ifx\curfontstyle\bfstylename  +  \ifx\curfontstyle\bfstylename      % bold:      \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize -  \else  +  \else      % regular:      \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize    \fi    \thiseurofont  } -% Hacks for glyphs from the EC fonts similar to \euro.  We don't -% use \let for the aliases, because sometimes we redefine the original -% macro, and the alias should reflect the redefinition. +% Glyphs from the EC fonts.  We don't use \let for the aliases, because +% sometimes we redefine the original macro, and the alias should reflect +% the redefinition. +% +% Use LaTeX names for the Icelandic letters. +\def\DH{{\ecfont \char"D0}} % Eth +\def\dh{{\ecfont \char"F0}} % eth +\def\TH{{\ecfont \char"DE}} % Thorn +\def\th{{\ecfont \char"FE}} % thorn +%  \def\guillemetleft{{\ecfont \char"13}}  \def\guillemotleft{\guillemetleft}  \def\guillemetright{{\ecfont \char"14}} @@ -2749,19 +3577,59 @@ end  \def\quotedblbase{{\ecfont \char"12}}  \def\quotesinglbase{{\ecfont \char"0D}}  % -\def\ecfont{% -  % We can't distinguish serif/sanserif and italic/slanted, but this +% 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 +% dummy definitions to worry about for index entries, etc. +% +% ogonek is also used with other letters in Lithuanian (IOU), but using +% the precomposed glyphs for those is not so easy since they aren't in +% the same EC font. +\def\ogonek#1{{% +  \def\temp{#1}% +  \ifx\temp\macrocharA\Aogonek +  \else\ifx\temp\macrochara\aogonek +  \else\ifx\temp\macrocharE\Eogonek +  \else\ifx\temp\macrochare\eogonek +  \else +    \ecfont \setbox0=\hbox{#1}% +    \ifdim\ht0=1ex\accent"0C #1% +    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% +    \fi +  \fi\fi\fi\fi +  }% +} +\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} +\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} +\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} +\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} +% +% Use the European Computer Modern fonts (cm-super in outline format) +% for non-CM glyphs.  That is ec* for regular text and tc* for the text +% companion symbols (LaTeX TS1 encoding).  Both are part of the ec +% package and follow the same conventions. +%  +\def\ecfont{\etcfont{e}} +\def\tcfont{\etcfont{t}} +% +\def\etcfont#1{% +  % We can't distinguish serif/sans and italic/slanted, but this    % is used for crude hacks anyway (like adding French and German    % quotes to documents typeset with CM, where we lose kerning), so    % hopefully nobody will notice/care.    \edef\ecsize{\csname\curfontsize ecsize\endcsname}%    \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% -  \ifx\curfontstyle\bfstylename -    % bold: -    \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize +  \ifmonospace +    % typewriter: +    \font\thisecfont = #1ctt\ecsize \space at \nominalsize    \else -    % regular: -    \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize +    \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  } @@ -2771,7 +3639,7 @@ end  % Adapted from the plain.tex definition of \copyright.  %  \def\registeredsymbol{% -  $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% +  $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}%                 \hfil\crcr\Orb}}%      }$%  } @@ -2783,8 +3651,8 @@ end  % Laurent Siebenmann reports \Orb undefined with:  %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38  % so we'll define it if necessary. -%  -\ifx\Orb\undefined +% +\ifx\Orb\thisisundefined  \def\Orb{\mathhexbox20D}  \fi @@ -2804,16 +3672,20 @@ end  \newif\ifseenauthor  \newif\iffinishedtitlepage -% Do an implicit @contents or @shortcontents after @end titlepage if the -% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. -% -\newif\ifsetcontentsaftertitlepage - \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue -\newif\ifsetshortcontentsaftertitlepage - \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue - -\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% -        \endgroup\page\hbox{}\page} +% @setcontentsaftertitlepage used to do an implicit @contents or +% @shortcontents after @end titlepage, but it is now obsolete. +\def\setcontentsaftertitlepage{% +  \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo +              command; move your @contents command if you want the contents +              after the title page.}}% +\def\setshortcontentsaftertitlepage{% +  \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo +              command; move your @shortcontents and @contents commands if you  +              want the contents after the title page.}}% + +\parseargdef\shorttitlepage{% +  \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. @@ -2851,20 +3723,6 @@ end    % Need this before the \...aftertitlepage checks so that if they are    % in effect the toc pages will come out with page numbers.    \HEADINGSon -  % -  % If they want short, they certainly want long too. -  \ifsetshortcontentsaftertitlepage -    \shortcontents -    \contents -    \global\let\shortcontents = \relax -    \global\let\contents = \relax -  \fi -  % -  \ifsetcontentsaftertitlepage -    \contents -    \global\let\contents = \relax -    \global\let\shortcontents = \relax -  \fi  }  \def\finishtitlepage{% @@ -2873,17 +3731,27 @@ end    \finishedtitlepagetrue  } -%%% Macros to be used within @titlepage: +% Settings used for typesetting titles: no hyphenation, no indentation, +% don't worry much about spacing, ragged right.  This should be used +% inside a \vbox, and fonts need to be set appropriately first. \par should +% be specified before the end of the \vbox, since a vbox is a group. +%  +\def\raggedtitlesettings{% +  \rm +  \hyphenpenalty=10000 +  \parindent=0pt +  \tolerance=5000 +  \ptexraggedright +} + +% Macros to be used within @titlepage: -\let\subtitlerm=\tenrm +\let\subtitlerm=\rmfont  \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} -\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines -		\let\tt=\authortt} -  \parseargdef\title{%    \checkenv\titlepage -  \leftline{\titlefonts\rm #1} +  \vbox{\titlefonts \raggedtitlesettings #1\par}%    % print a rule at the page bottom also.    \finishedtitlepagefalse    \vskip4pt \hrule height 4pt width \hsize \vskip4pt @@ -2904,12 +3772,12 @@ end    \else      \checkenv\titlepage      \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi -    {\authorfont \leftline{#1}}% +    {\secfonts\rm \leftline{#1}}%    \fi  } -%%% Set up page headings and footings. +% Set up page headings and footings.  \let\thispage=\folio @@ -2918,7 +3786,7 @@ end  \newtoks\evenfootline    % footline on even pages  \newtoks\oddfootline     % footline on odd pages -% Now make TeX use those variables +% Now make \makeheadline and \makefootline in Plain TeX use those variables  \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline                              \else \the\evenheadline \fi}}  \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline @@ -2957,7 +3825,7 @@ end    %    % Leave some space for the footline.  Hopefully ok to assume    % @evenfooting will not be used by itself. -  \global\advance\pageheight by -12pt +  \global\advance\txipageheight by -12pt    \global\advance\vsize by -12pt  } @@ -2974,13 +3842,17 @@ end  % @everyheadingmarks  % @everyfootingmarks +% These define \getoddheadingmarks, \getevenheadingmarks, +% \getoddfootingmarks, and \getevenfootingmarks, each to one of +% \gettopheadingmarks, \getbottomheadingmarks. +%  \def\evenheadingmarks{\headingmarks{even}{heading}}  \def\oddheadingmarks{\headingmarks{odd}{heading}}  \def\evenfootingmarks{\headingmarks{even}{footing}}  \def\oddfootingmarks{\headingmarks{odd}{footing}} -\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} +\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}                            \headingmarks{odd}{heading}{#1} } -\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} +\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}                            \headingmarks{odd}{footing}{#1} }  % #1 = even/odd, #2 = heading/footing, #3 = top/bottom.  \def\headingmarks#1#2#3 {% @@ -3001,12 +3873,16 @@ end  % By default, they are off at the start of a document,  % and turned `on' after @end titlepage. -\def\headings #1 {\csname HEADINGS#1\endcsname} +\parseargdef\headings{\csname HEADINGS#1\endcsname} + +\def\headingsoff{% non-global headings elimination +  \evenheadline={\hfil}\evenfootline={\hfil}% +   \oddheadline={\hfil}\oddfootline={\hfil}% +} + +\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting +\HEADINGSoff  % it's the default -\def\HEADINGSoff{% -\global\evenheadline={\hfil} \global\evenfootline={\hfil} -\global\oddheadline={\hfil} \global\oddfootline={\hfil}} -\HEADINGSoff  % 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 @@ -3017,7 +3893,7 @@ end  \global\evenfootline={\hfil}  \global\oddfootline={\hfil}  \global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}}  \global\let\contentsalignmacro = \chapoddpage  }  \let\contentsalignmacro = \chappager @@ -3028,8 +3904,8 @@ end  \global\pageno=1  \global\evenfootline={\hfil}  \global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}}  \global\let\contentsalignmacro = \chappager  }  \def\HEADINGSon{\HEADINGSdouble} @@ -3040,7 +3916,7 @@ end  \global\evenfootline={\hfil}  \global\oddfootline={\hfil}  \global\evenheadline={\line{\folio\hfil\thistitle}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}}  \global\let\contentsalignmacro = \chapoddpage  } @@ -3048,8 +3924,8 @@ end  \def\HEADINGSsinglex{%  \global\evenfootline={\hfil}  \global\oddfootline={\hfil} -\global\evenheadline={\line{\thischapter\hfil\folio}} -\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\evenheadline={\line{\thischapterheading\hfil\folio}} +\global\oddheadline={\line{\thischapterheading\hfil\folio}}  \global\let\contentsalignmacro = \chappager  } @@ -3057,7 +3933,7 @@ end  % This produces Day Month Year style of output.  % Only define if not already defined, in case a txi-??.tex file has set  % up a different format (e.g., txi-cs.tex does this). -\ifx\today\undefined +\ifx\today\thisisundefined  \def\today{%    \number\day\space    \ifcase\month @@ -3118,7 +3994,7 @@ end      \begingroup        \advance\leftskip by-\tableindent        \advance\hsize by\tableindent -      \advance\rightskip by0pt plus1fil +      \advance\rightskip by0pt plus1fil\relax        \leavevmode\unhbox0\par      \endgroup      % @@ -3132,7 +4008,7 @@ end      % cause the example and the item to crash together.  So we use this      % bizarre value of 10001 as a signal to \aboveenvbreak to insert      % \parskip glue after all.  Section titles are handled this way also. -    %  +    %      \penalty 10001      \endgroup      \itemxneedsnegativevskipfalse @@ -3226,9 +4102,18 @@ end    \parindent=0pt    \parskip=\smallskipamount    \ifdim\parskip=0pt \parskip=2pt \fi +  % +  % Try typesetting the item mark so that if the document erroneously says +  % something like @itemize @samp (intending @table), there's an error +  % right away at the @itemize.  It's not the best error message in the +  % world, but it's better than leaving it to the @item.  This means if +  % the user wants an empty mark, they have to say @w{} not just @w.    \def\itemcontents{#1}% +  \setbox0 = \hbox{\itemcontents}% +  %    % @itemize with no arg is equivalent to @itemize @bullet.    \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi +  %    \let\item=\itemizeitem  } @@ -3249,7 +4134,13 @@ end     \ifnum\lastpenalty<10000 \parskip=0in \fi     \noindent     \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% -   \vadjust{\penalty 1200}}% not good to break after first line of item. +   % +   \ifinner\else +     \vadjust{\penalty 1200}% not good to break after first line of item. +   \fi +   % We can be in inner vertical mode in a footnote, although an +   % @itemize looks awful there. +  }%    \flushcr  } @@ -3467,15 +4358,26 @@ end  }  % 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{% +  \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 +}%  % -% @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.  Note that \everycr resets \everytab. -\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% +% 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 encounter the problem it was intended to solve again. +% we again encounter the problem the 1sp was intended to solve.  %					--karl, nathan@acm.org, 20apr99.  \def\tab{\checkenv\multitable &\the\everytab}% @@ -3503,15 +4405,15 @@ end    %    \everycr = {%      \noalign{% -      \global\everytab={}% +      \global\everytab={}% Reset from possible headitem.        \global\colcount=0 % Reset the column counter. -      % Check for saved footnotes, etc. +      % +      % Check for saved footnotes, etc.:        \checkinserts -      % Keeps underfull box messages off when table breaks over pages. -      %\filbreak -	% Maybe so, but it also creates really weird page breaks when the -	% table breaks over pages. Wouldn't \vfil be better?  Wait until the -	% problem manifests itself, so it can be fixed for real --karl. +      % +      % Perhaps a \nobreak, then reset: +      \headitemcrhook +      \global\let\headitemcrhook=\relax      }%    }%    % @@ -3587,18 +4489,18 @@ end  \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. +% 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. +\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. +\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller +                                      % than skip between lines in the table.  \fi} @@ -3750,7 +4652,7 @@ end  \def\value{\begingroup\makevalueexpandable\valuexxx}  \def\valuexxx#1{\expandablevalue{#1}\endgroup}  { -  \catcode`\- = \active \catcode`\_ = \active +  \catcode`\-=\active \catcode`\_=\active    %    \gdef\makevalueexpandable{%      \let\value = \expandablevalue @@ -3759,7 +4661,7 @@ end      % ..., but we might end up with active ones in the argument if      % we're called from @code, as @code{@value{foo-bar_}}, though.      % So \let them to their normal equivalents. -    \let-\realdash \let_\normalunderscore +    \let-\normaldash \let_\normalunderscore    }  } @@ -3770,7 +4672,12 @@ end  % variable's value contains other Texinfo commands, it's almost certain  % it will fail (although perhaps we could fix that with sufficient work  % to do a one-level expansion on the result, instead of complete). -% +%  +% Unfortunately, this has the consequence that when _ is in the *value* +% of an @set, it does not print properly in the roman fonts (get the cmr +% dot accent at position 126 instead).  No fix comes to mind, and it's +% been this way since 2003 or earlier, so just ignore it. +%   \def\expandablevalue#1{%    \expandafter\ifx\csname SET#1\endcsname\relax      {[No value for ``#1'']}% @@ -3780,10 +4687,36 @@ end    \fi  } +% Like \expandablevalue, but completely expandable (the \message in the +% definition above operates at the execution level of TeX).  Used when +% writing to auxiliary files, due to the expansion that \write does. +% If flag is undefined, pass through an unexpanded @value command: maybe it  +% will be set by the time it is read back in. +% +% NB flag names containing - or _ may not work here. +\def\dummyvalue#1{% +  \expandafter\ifx\csname SET#1\endcsname\relax +    \noexpand\value{#1}% +  \else +    \csname SET#1\endcsname +  \fi +} + +% Used for @value's in index entries to form the sort key: expand the @value +% if possible, otherwise sort late. +\def\indexnofontsvalue#1{% +  \expandafter\ifx\csname SET#1\endcsname\relax +    ZZZZZZZ +  \else +    \csname SET#1\endcsname +  \fi +} +  % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined  % with @set. -% -% To get special treatment of `@end ifset,' call \makeond and the redefine. +%  +% To get the special treatment we need for `@end ifset,' we call +% \makecond and then redefine.  %  \makecond{ifset}  \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} @@ -3799,7 +4732,7 @@ end  }  \def\ifsetfail{\doignore{ifset}} -% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% @ifclear VAR ... @end executes the `...' iff VAR has never been  % defined with @set, or has been undefined with @clear.  %  % The `\else' inside the `\doifset' parameter is a trick to reuse the @@ -3810,6 +4743,35 @@ end  \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}  \def\ifclearfail{\doignore{ifclear}} +% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written +% without the @) is in fact defined.  We can only feasibly check at the +% TeX level, so something like `mathcode' is going to considered +% defined even though it is not a Texinfo command. +%  +\makecond{ifcommanddefined} +\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} +% +\def\doifcmddefined#1#2{{% +    \makevalueexpandable +    \let\next=\empty +    \expandafter\ifx\csname #2\endcsname\relax +      #1% If not defined, \let\next as above. +    \fi +    \expandafter +  }\next +} +\def\ifcmddefinedfail{\doignore{ifcommanddefined}} + +% @ifcommandnotdefined CMD ... handled similar to @ifclear above. +\makecond{ifcommandnotdefined} +\def\ifcommandnotdefined{% +  \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} +\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} + +% Set the `txicommandconditionals' variable, so documents have a way to +% test if the @ifcommand...defined conditionals are available. +\set txicommandconditionals +  % @dircategory CATEGORY  -- specify a category of the dir file  % which this file should belong to.  Ignore this in TeX.  \let\dircategory=\comment @@ -3825,19 +4787,16 @@ end  % except not \outer, so it can be used within macros and \if's.  \edef\newwrite{\makecsname{ptexnewwrite}} -% \newindex {foo} defines an index named foo. -% It automatically defines \fooindex such that -% \fooindex ...rest of line... puts an entry in the index foo. -% It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index.  The file's extension is foo. +% \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{% -  \iflinks -    \expandafter\newwrite \csname#1indfile\endcsname -    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file -  \fi +  \expandafter\chardef\csname#1indfile\endcsname=0    \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index      \noexpand\doindex{#1}}  } @@ -3851,14 +4810,19 @@ end  \def\defcodeindex{\parsearg\newcodeindex}  %  \def\newcodeindex#1{% -  \iflinks -    \expandafter\newwrite \csname#1indfile\endcsname -    \openout \csname#1indfile\endcsname \jobname.#1 -  \fi +  \expandafter\chardef\csname#1indfile\endcsname=0    \expandafter\xdef\csname#1index\endcsname{%      \noexpand\docodeindex{#1}}%  } +% The default indices: +\newindex{cp}%      concepts, +\newcodeindex{fn}%  functions, +\newcodeindex{vr}%  variables, +\newcodeindex{tp}%  types, +\newcodeindex{ky}%  keys +\newcodeindex{pg}%  and programs. +  % @synindex foo bar    makes index foo feed into index bar.  % Do this instead of @defindex foo if you don't want it as a separate index. @@ -3872,14 +4836,7 @@ end  % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),  % #3 the target index (bar).  \def\dosynindex#1#2#3{% -  % Only do \closeout if we haven't already done it, else we'll end up -  % closing the target index. -  \expandafter \ifx\csname donesynindex#2\endcsname \undefined -    % The \closeout helps reduce unnecessary open files; the limit on the -    % Acorn RISC OS is a mere 16 files. -    \expandafter\closeout\csname#2indfile\endcsname -    \expandafter\let\csname\donesynindex#2\endcsname = 1 -  \fi +  \requireopenindexfile{#3}%    % redefine \fooindfile:    \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname    \expandafter\let\csname#2indfile\endcsname=\temp @@ -3887,125 +4844,97 @@ end    \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%  } -% Define \doindex, the driver for all \fooindex macros. +% Define \doindex, the driver for all index macros.  % Argument #1 is generated by the calling \fooindex macro, -%  and it is "foo", the name of the index. - -% \doindex just uses \parsearg; it calls \doind for the actual work. -% This is because \doind is more useful to call from other macros. +% and it is the two-letter name of the index. -% There is also \dosubind {index}{topic}{subtopic} -% which makes an entry in a two-level index such as the operation index. - -\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} -\def\singleindexer #1{\doind{\indexname}{#1}} +\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} +\def\doindexxxx #1{\doind{\indexname}{#1}}  % like the previous two, but they put @code around the argument. -\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} -\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} +\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} +\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}} -% Take care of Texinfo commands that can appear in an index entry. -% Since there are some commands we want to expand, and others we don't, -% we have to laboriously prevent expansion for those that we don't. + +% Used when writing an index entry out to an index file to prevent +% expansion of Texinfo commands that can appear in an index entry.  %  \def\indexdummies{%    \escapechar = `\\     % use backslash in output files. -  \def\@{@}% change to @@ when we switch to @ as escape char in index files. -  \def\ {\realbackslash\space }% -  % -  % Need these in case \tex is in effect and \{ is a \delimiter again. -  % But can't use \lbracecmd and \rbracecmd because texindex assumes -  % braces and backslashes are used only as delimiters. -  \let\{ = \mylbrace -  \let\} = \myrbrace -  % -  % I don't entirely understand this, but when an index entry is -  % generated from a macro call, the \endinput which \scanmacro inserts -  % causes processing to be prematurely terminated.  This is, -  % apparently, because \indexsorttmp is fully expanded, and \endinput -  % is an expandable command.  The redefinition below makes \endinput -  % disappear altogether for that purpose -- although logging shows that -  % processing continues to some further point.  On the other hand, it -  % seems \endinput does not hurt in the printed index arg, since that -  % is still getting written without apparent harm. -  %  -  % Sample source (mac-idx3.tex, reported by Graham Percival to -  % help-texinfo, 22may06): -  % @macro funindex {WORD} -  % @findex xyz -  % @end macro -  % ... -  % @funindex commtest -  %  -  % The above is not enough to reproduce the bug, but it gives the flavor. -  %  -  % Sample whatsit resulting: -  % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} -  %  -  % So: -  \let\endinput = \empty +  \definedummyletter\@% +  \definedummyletter\ % +  % +  % For texindex which always views { and } as separators. +  \def\{{\lbracechar{}}% +  \def\}{\rbracechar{}}%    %    % Do the redefinitions. -  \commondummies +  \definedummies  } -% For the aux and toc files, @ is the escape character.  So we want to -% redefine everything using @ as the escape character (instead of -% \realbackslash, still used for index files).  When everything uses @, -% this will be simpler. +% Used for the aux and toc files, where @ is the escape character.  %  \def\atdummies{% -  \def\@{@@}% -  \def\ {@ }% -  \let\{ = \lbraceatcmd -  \let\} = \rbraceatcmd +  \definedummyletter\@% +  \definedummyletter\ % +  \definedummyletter\{% +  \definedummyletter\}%    %    % Do the redefinitions. -  \commondummies +  \definedummies    \otherbackslash  } -% Called from \indexdummies and \atdummies. +% \definedummyword defines \#1 as \string\#1\space, thus effectively +% preventing its expansion.  This is used only for control words, +% not control letters, because the \space would be incorrect for +% control characters, but is needed to separate the control word +% from whatever follows.  % -\def\commondummies{% -  % -  % \definedummyword defines \#1 as \string\#1\space, thus effectively -  % preventing its expansion.  This is used only for control% words, -  % not control letters, because the \space would be incorrect for -  % control characters, but is needed to separate the control word -  % from whatever follows. -  % -  % For control letters, we have \definedummyletter, which omits the -  % space. -  % -  % These can be used both for control words that take an argument and -  % those that do not.  If it is followed by {arg} in the input, then -  % that will dutifully get written to the index (or wherever). -  % -  \def\definedummyword  ##1{\def##1{\string##1\space}}% -  \def\definedummyletter##1{\def##1{\string##1}}% -  \let\definedummyaccent\definedummyletter +% These can be used both for control words that take an argument and +% those that do not.  If it is followed by {arg} in the input, then +% that will dutifully get written to the index (or wherever). +% +% For control letters, we have \definedummyletter, which omits the +% space. +% +\def\definedummyword  #1{\def#1{\string#1\space}}% +\def\definedummyletter#1{\def#1{\string#1}}% +\let\definedummyaccent\definedummyletter + +% Called from \indexdummies and \atdummies, to effectively prevent +% the expansion of commands. +% +\def\definedummies{%    % +  \let\commondummyword\definedummyword +  \let\commondummyletter\definedummyletter +  \let\commondummyaccent\definedummyaccent    \commondummiesnofonts    %    \definedummyletter\_% +  \definedummyletter\-%    %    % Non-English letters.    \definedummyword\AA    \definedummyword\AE +  \definedummyword\DH    \definedummyword\L -  \definedummyword\OE    \definedummyword\O +  \definedummyword\OE +  \definedummyword\TH    \definedummyword\aa    \definedummyword\ae +  \definedummyword\dh +  \definedummyword\exclamdown    \definedummyword\l -  \definedummyword\oe    \definedummyword\o -  \definedummyword\ss -  \definedummyword\exclamdown -  \definedummyword\questiondown +  \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 @@ -4021,21 +4950,29 @@ end    \definedummyword\TeX    %    % Assorted special characters. +  \definedummyword\atchar +  \definedummyword\arrow    \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\expansion +  \definedummyword\lbracechar +  \definedummyword\leq +  \definedummyword\mathopsup    \definedummyword\minus +  \definedummyword\ogonek    \definedummyword\pounds    \definedummyword\point    \definedummyword\print @@ -4045,79 +4982,138 @@ end    \definedummyword\quoteleft    \definedummyword\quoteright    \definedummyword\quotesinglbase +  \definedummyword\rbracechar    \definedummyword\result +  \definedummyword\sub +  \definedummyword\sup    \definedummyword\textdegree    %    % We want to disable all macros so that they are not expanded by \write.    \macrolist +  \let\value\dummyvalue    %    \normalturnoffactive -  % -  % Handle some cases of @value -- where it does not contain any -  % (non-fully-expandable) commands. -  \makevalueexpandable  } -% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% \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. -  \definedummyletter\!% -  \definedummyaccent\"% -  \definedummyaccent\'% -  \definedummyletter\*% -  \definedummyaccent\,% -  \definedummyletter\.% -  \definedummyletter\/% -  \definedummyletter\:% -  \definedummyaccent\=% -  \definedummyletter\?% -  \definedummyaccent\^% -  \definedummyaccent\`% -  \definedummyaccent\~% -  \definedummyword\u -  \definedummyword\v -  \definedummyword\H -  \definedummyword\dotaccent -  \definedummyword\ringaccent -  \definedummyword\tieaccent -  \definedummyword\ubaraccent -  \definedummyword\udotaccent -  \definedummyword\dotless +  \commondummyletter\!% +  \commondummyaccent\"% +  \commondummyaccent\'% +  \commondummyletter\*% +  \commondummyaccent\,% +  \commondummyletter\.% +  \commondummyletter\/% +  \commondummyletter\:% +  \commondummyaccent\=% +  \commondummyletter\?% +  \commondummyaccent\^% +  \commondummyaccent\`% +  \commondummyaccent\~% +  \commondummyword\u +  \commondummyword\v +  \commondummyword\H +  \commondummyword\dotaccent +  \commondummyword\ogonek +  \commondummyword\ringaccent +  \commondummyword\tieaccent +  \commondummyword\ubaraccent +  \commondummyword\udotaccent +  \commondummyword\dotless    %    % Texinfo font commands. -  \definedummyword\b -  \definedummyword\i -  \definedummyword\r -  \definedummyword\sc -  \definedummyword\t +  \commondummyword\b +  \commondummyword\i +  \commondummyword\r +  \commondummyword\sansserif +  \commondummyword\sc +  \commondummyword\slanted +  \commondummyword\t    %    % Commands that take arguments. -  \definedummyword\acronym -  \definedummyword\cite -  \definedummyword\code -  \definedummyword\command -  \definedummyword\dfn -  \definedummyword\emph -  \definedummyword\env -  \definedummyword\file -  \definedummyword\kbd -  \definedummyword\key -  \definedummyword\math -  \definedummyword\option -  \definedummyword\pxref -  \definedummyword\ref -  \definedummyword\samp -  \definedummyword\strong -  \definedummyword\tie -  \definedummyword\uref -  \definedummyword\url -  \definedummyword\var -  \definedummyword\verb -  \definedummyword\w -  \definedummyword\xref +  \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 +} + +% For testing: output @{ and @} in index sort strings as \{ and \}. +\newif\ifusebracesinindexes + +\let\indexlbrace\relax +\let\indexrbrace\relax + +{\catcode`\@=0 +\catcode`\\=13 +  @gdef@backslashdisappear{@def\{}} +} + +{ +\catcode`\<=13 +\catcode`\-=13 +\catcode`\`=13 +  \gdef\indexnonalnumdisappear{% +    \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 +    % +    \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else +      \backslashdisappear +    \fi +    % +    \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else +      \def-{}% +    \fi +    \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else +      \def<{}% +    \fi +    \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else +      \def\@{}% +    \fi +  } + +  \gdef\indexnonalnumreappear{% +    \useindexbackslash +    \let-\normaldash +    \let<\normalless +    \def\@{@}% +  }  } +  % \indexnofonts is used when outputting the strings to sort the index  % by, and when constructing control sequence names.  It eliminates all  % control sequences and just writes whatever the best ASCII sort string @@ -4125,12 +5121,11 @@ end  %  \def\indexnofonts{%    % Accent commands should become @asis. -  \def\definedummyaccent##1{\let##1\asis}% +  \def\commondummyaccent##1{\let##1\asis}%    % We can just ignore other control letters. -  \def\definedummyletter##1{\let##1\empty}% -  % Hopefully, all control words can become @asis. -  \let\definedummyword\definedummyaccent -  % +  \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 @@ -4140,79 +5135,102 @@ end    %    \def\ { }%    \def\@{@}% -  % how to handle braces?    \def\_{\normalunderscore}% +  \def\-{}% @- shouldn't affect sorting +  % +  \uccode`\1=`\{ \uppercase{\def\{{1}}% +  \uccode`\1=`\} \uppercase{\def\}{1}}% +  \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\o{o}% -  \def\ss{ss}% -  \def\exclamdown{!}% -  \def\questiondown{?}%    \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. -  % (The following {} will end up in the sort string, but that's ok.) -  \def\bullet{bullet}% -  \def\comma{,}% -  \def\copyright{copyright}% -  \def\registeredsymbol{R}% -  \def\dots{...}% -  \def\enddots{...}% -  \def\equiv{==}% -  \def\error{error}% -  \def\euro{euro}% -  \def\guillemetleft{<<}% -  \def\guillemetright{>>}% -  \def\guilsinglleft{<}% -  \def\guilsinglright{>}% -  \def\expansion{==>}% -  \def\minus{-}% -  \def\pounds{pounds}% -  \def\point{.}% -  \def\print{-|}% -  \def\quotedblbase{"}% -  \def\quotedblleft{"}% -  \def\quotedblright{"}% -  \def\quoteleft{`}% -  \def\quoteright{'}% -  \def\quotesinglbase{,}% -  \def\result{=>}% -  \def\textdegree{degrees}% +  % 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. -  %  +  %    \macrolist +  \let\value\indexnofontsvalue  } +\def\defglyph#1#2{\def#1##1{#2}} % see above + + + -\let\indexbackslash=0  %overridden during \printindex.  \let\SETmarginindex=\relax % put index entries in margin (undocumented)?  % Most index entries go through here, but \dosubind is the general case.  % #1 is the index name, #2 is the entry text.  \def\doind#1#2{\dosubind{#1}{#2}{}} -% Workhorse for all \fooindexes. +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. +% TODO: Two-level index?  Operation index? + +% Workhorse for all indexes.  % #1 is name of index, #2 is stuff to put there, #3 is subentry --  % empty if called from \doind, as we usually are (the main exception  % is with most defuns, which call us directly). @@ -4220,6 +5238,7 @@ end  \def\dosubind#1#2#3{%    \iflinks    {% +    \requireopenindexfile{#1}%      % Store the main index entry text (including the third arg).      \toks0 = {#2}%      % If third arg is present, precede it with a space. @@ -4235,7 +5254,50 @@ end    \fi  } -% Write the entry in \toks0 to the index file: +% Check if an index file has been opened, and if not, open it. +\def\requireopenindexfile#1{% +\ifnum\csname #1indfile\endcsname=0 +  \expandafter\newwrite \csname#1indfile\endcsname +  \edef\suffix{#1}% +  % A .fls suffix would conflict with the file extension for the output +  % of -recorder, so use .f1s instead. +  \ifx\suffix\indexisfl\def\suffix{f1}\fi +  % Open the file +  \immediate\openout\csname#1indfile\endcsname \jobname.\suffix +  % Using \immediate above here prevents an object entering into the current  +  % box, which could confound checks such as those in \safewhatsit for +  % preceding skips. +  \typeout{Writing index file \jobname.\suffix}% +\fi} +\def\indexisfl{fl} + +% Output \ as {\indexbackslash}, because \ is an escape character in +% the index files. +\let\indexbackslash=\relax +{\catcode`\@=0 \catcode`\\=\active +  @gdef@useindexbackslash{@def\{{@indexbackslash}}} +} + +% Definition for writing index entry text. +\def\sortas#1{\ignorespaces}% + +% Definition for writing index entry sort key.  Should occur at the at +% the beginning of the index entry, like +%     @cindex @sortas{september} \september +% The \ignorespaces takes care of following space, but there's no way +% to remove space before it. +{ +\catcode`\-=13 +\gdef\indexwritesortas{% +  \begingroup +  \indexnonalnumreappear +  \indexwritesortasxxx} +\gdef\indexwritesortasxxx#1{% +  \xdef\indexsortkey{#1}\endgroup} +} + + +% Write the entry in \toks0 to the index file.  %  \def\dosubindwrite{%    % Put the index entry in the margin if desired. @@ -4245,14 +5307,26 @@ end    %    % Remember, we are within a group.    \indexdummies % Must do this here, since \bf, etc expand at this stage -  \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now -      % so it will be output as is; and it will print as backslash. +  \useindexbackslash % \indexbackslash isn't defined now so it will be output  +                     % as is; and it will print as backslash. +  % The braces around \indexbrace are recognized by texindex.    % -  % Process the index entry with all font commands turned off, to -  % get the string to sort by. +  % Get the string to sort by, by processing the index entry with all +  % font commands turned off.    {\indexnofonts -   \edef\temp{\the\toks0}% need full expansion -   \xdef\indexsorttmp{\temp}% +   \def\lbracechar{{\indexlbrace}}% +   \def\rbracechar{{\indexrbrace}}% +   \let\{=\lbracechar +   \let\}=\rbracechar +   \indexnonalnumdisappear +   \xdef\indexsortkey{}% +   \let\sortas=\indexwritesortas +   \edef\temp{\the\toks0}% +   \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas +   \ifx\indexsortkey\empty +     \xdef\indexsortkey{\temp}% +     \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi +   \fi    }%    %    % Set up the complete index entry, with both the sort key and @@ -4262,10 +5336,11 @@ end    % sorted result.    \edef\temp{%      \write\writeto{% -      \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% +      \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}%    }%    \temp  } +\newbox\dummybox % used above  % Take care of unwanted page breaks/skips around a whatsit:  % @@ -4302,10 +5377,9 @@ end  %  % ..., ready, GO:  % -\def\safewhatsit#1{% -\ifhmode +\def\safewhatsit#1{\ifhmode    #1% -\else + \else    % \lastskip and \lastpenalty cannot both be nonzero simultaneously.    \whatsitskip = \lastskip    \edef\lastskipmacro{\the\lastskip}% @@ -4329,7 +5403,6 @@ end      % to re-insert the same penalty (values >10000 are used for various      % signals); since we just inserted a non-discardable item, any      % following glue (such as a \parskip) would be a breakpoint.  For example: -    %       %   @deffn deffn-whatever      %   @vindex index-whatever      %   Description. @@ -4342,8 +5415,7 @@ end      % (the whatsit from the \write), so we must insert a \nobreak.      \nobreak\vskip\whatsitskip    \fi -\fi -} +\fi}  % The index entry written in the file actually looks like  %  \entry {sortstring}{page}{topic} @@ -4393,52 +5465,113 @@ end    % \initial {@}    % as its first line, TeX doesn't complain about mismatched braces    % (because it thinks @} is a control sequence). -  \catcode`\@ = 11 -  \openin 1 \jobname.#1s +  \catcode`\@ = 12 +  % See comment in \requireopenindexfile. +  \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi +  \openin 1 \jobname.\indexname s    \ifeof 1      % \enddoublecolumns gets confused if there is no text in the index,      % and it loses the chapter title and the aux file entries for the      % index.  The easiest way to prevent this problem is to make sure      % there is some text.      \putwordIndexNonexistent +    \typeout{No file \jobname.\indexname s.}%    \else +    \catcode`\\ = 0      %      % If the index file exists but is empty, then \openin leaves \ifeof      % false.  We have to make TeX try to read something from the file, so      % it can discover if there is anything in it. -    \read 1 to \temp +    \read 1 to \thisline      \ifeof 1        \putwordIndexIsEmpty      \else        % Index files are almost Texinfo source, but we use \ as the escape        % character.  It would be better to use @, but that's too big a change        % to make right now. -      \def\indexbackslash{\backslashcurfont}% -      \catcode`\\ = 0 -      \escapechar = `\\ +      \def\indexbackslash{\ttbackslash}% +      \let\indexlbrace\{   % Likewise, set these sequences for braces +      \let\indexrbrace\}   % used in the sort key.        \begindoublecolumns -      \input \jobname.#1s +      \let\dotheinsertentrybox\dotheinsertentryboxwithpenalty +      % +      % Read input from the index file line by line. +      \loopdo +        \ifeof1 \else +          \read 1 to \nextline +        \fi +        % +        \indexinputprocessing +        \thisline +        % +        \ifeof1\else +        \let\thisline\nextline +      \repeat +      %%        \enddoublecolumns      \fi    \fi    \closein 1  \endgroup} +\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx} +\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next} + +\def\indexinputprocessing{% +  \ifeof1 +    \let\firsttoken\relax +  \else +    \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}% +    \act +  \fi +} +\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken} +\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1} +  % These macros are used by the sorted index file itself.  % Change them to control the appearance of the index. -\def\initial#1{{% -  % Some minor font changes for the special characters. -  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt -  % +{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 +\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 +\catcode`\$=3 +\gdef\initialglyphs{% +  % Some changes for non-alphabetic characters.  Using the glyphs from the +  % math fonts looks more consistent than the typewriter font used elsewhere +  % for these characters. +  \def\indexbackslash{\math{\backslash}}% +  \let\\=\indexbackslash +  % +  % Can't get bold backslash so don't use bold forward slash +  \catcode`\/=13 +  \def/{{\secrmnotbold \normalslash}}% +  \def-{{\normaldash\normaldash}}% en dash `--' +  \def^{{\chapbf \normalcaret}}% +  \def~{{\chapbf \normaltilde}}% +  \def\_{% +     \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% +  \def|{$\vert$}% +  \def<{$\less$}% +  \def>{$\gtr$}% +  \def+{$\normalplus$}% +}} + +\def\initial{% +  \bgroup +  \initialglyphs +  \initialx +} + +\def\initialx#1{%    % Remove any glue we may have, we'll be inserting our own.    \removelastskip    %    % We like breaks before the index initials, so insert a bonus. +  % The glue before the bonus allows a little bit of space at the +  % bottom of a column to reduce an increase in inter-line spacing.    \nobreak -  \vskip 0pt plus 3\baselineskip -  \penalty 0 -  \vskip 0pt plus -3\baselineskip +  \vskip 0pt plus 5\baselineskip +  \penalty -300  +  \vskip 0pt plus -5\baselineskip    %    % Typeset the initial.  Making this add up to a whole number of    % baselineskips increases the chance of the dots lining up from column @@ -4446,103 +5579,214 @@ end    % we need before each entry, but it's better.    %    % No shrink because it confuses \balancecolumns. -  \vskip 1.67\baselineskip plus .5\baselineskip -  \leftline{\secbf #1}% +  \vskip 1.67\baselineskip plus 1\baselineskip +  \leftline{\secfonts \kern-0.05em \secbf #1}% +  % \secfonts is inside the argument of \leftline so that the change of +  % \baselineskip will not affect any glue inserted before the vbox that +  % \leftline creates.    % Do our best not to break after the initial.    \nobreak    \vskip .33\baselineskip plus .1\baselineskip -}} +  \egroup % \initialglyphs +} + +\newdimen\entryrightmargin +\entryrightmargin=0pt  % \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.  % -% A straightforward implementation would start like this: -%	\def\entry#1#2{... -% But this freezes the catcodes in the argument, and can cause problems to -% @code, which sets - active.  This problem was fixed by a kludge--- -% ``-'' was active throughout whole index, but this isn't really right. -% -% The right solution is to prevent \entry from swallowing the whole text. -%                                 --kasal, 21nov03  \def\entry{%    \begingroup      % +    % For pdfTeX and XeTeX. +    % The redefinition of \domark stops marks being added in \pdflink to  +    % preserve coloured links across page boundaries.  Otherwise the marks +    % would get in the way of \lastbox in \insertentrybox. +    \let\domark\relax +    %      % Start a new paragraph if necessary, so our assignments below can't      % affect previous text.      \par      % -    % Do not fill out the last line with white space. -    \parfillskip = 0in -    %      % No extra space above this paragraph.      \parskip = 0in      % -    % Do not prefer a separate line ending with a hyphen to fewer lines. -    \finalhyphendemerits = 0 -    % -    % \hangindent is only relevant when the entry text and page number -    % don't both fit on one line.  In that case, bob suggests starting the -    % dots pretty far over on the line.  Unfortunately, a large -    % indentation looks wrong when the entry text itself is broken across -    % lines.  So we use a small indentation and put up with long leaders. -    % -    % \hangafter is reset to 1 (which is the value we want) at the start -    % of each paragraph, so we need not do anything with that. -    \hangindent = 2em -    % -    % When the entry text needs to be broken, just fill out the first line -    % with blank space. -    \rightskip = 0pt plus1fil -    % -    % A bit of stretch before each entry for the benefit of balancing -    % columns. -    \vskip 0pt plus1pt +    % When reading the text of entry, convert explicit line breaks +    % from @* into spaces.  The user might give these in long section +    % titles, for instance. +    \def\*{\unskip\space\ignorespaces}% +    \def\entrybreak{\hfil\break}% An undocumented command      %      % Swallow the left brace of the text (first parameter):      \afterassignment\doentry      \let\temp =  } +\def\entrybreak{\unskip\space\ignorespaces}%  \def\doentry{% +    % Save the text of the entry +    \global\setbox\boxA=\hbox\bgroup      \bgroup % Instead of the swallowed brace.        \noindent        \aftergroup\finishentry        % And now comes the text of the entry. +      % Not absorbing as a macro argument reduces the chance of problems +      % with catcodes occurring.  } -\def\finishentry#1{% +{\catcode`\@=11 +\gdef\finishentry#1{% +    \egroup % end box A +    \dimen@ = \wd\boxA % Length of text of entry +    \global\setbox\boxA=\hbox\bgroup\unhbox\boxA      % #1 is the page number.      % -    % The following is kludged to not output a line of dots in the index if -    % there are no page numbers.  The next person who breaks this will be -    % cursed by a Unix daemon. -    \setbox\boxA = \hbox{#1}% -    \ifdim\wd\boxA = 0pt -      \ % +    % Get the width of the page numbers, and only use +    % leaders if they are present. +    \global\setbox\boxB = \hbox{#1}% +    \ifdim\wd\boxB = 0pt +      \null\nobreak\hfill\ %      \else        % -      % If we must, put the page number on a line of its own, and fill out -      % this line with blank space.  (The \hfil is overwhelmed with the -      % fill leaders glue in \indexdotfill if the page number does fit.) -      \hfil\penalty50        \null\nobreak\indexdotfill % Have leaders before the page number.        % -      % The `\ ' here is removed by the implicit \unskip that TeX does as -      % part of (the primitive) \par.  Without it, a spurious underfull -      % \hbox ensues.        \ifpdf -	\pdfgettoks#1.% -	\ \the\toksA +        \pdfgettoks#1.% +        \hskip\skip\thinshrinkable\the\toksA        \else -	\ #1% +        \ifx\XeTeXrevision\thisisundefined +          \hskip\skip\thinshrinkable #1% +        \else +          \pdfgettoks#1.% +          \hskip\skip\thinshrinkable\the\toksA +        \fi        \fi      \fi -    \par +    \egroup % end \boxA +    \ifdim\wd\boxB = 0pt +      \global\setbox\entrybox=\vbox{\unhbox\boxA}% +    \else +    \global\setbox\entrybox=\vbox\bgroup +      % We want the text of the entries to be aligned to the left, and the +      % page numbers to be aligned to the right. +      % +      \parindent = 0pt +      \advance\leftskip by 0pt plus 1fil +      \advance\leftskip by 0pt plus -1fill +      \rightskip = 0pt plus -1fil +      \advance\rightskip by 0pt plus 1fill +      % Cause last line, which could consist of page numbers on their own +      % if the list of page numbers is long, to be aligned to the right. +      \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 1em +        \advance\parindent by -1em +      \fi\fi +      \indent % start paragraph +      \unhbox\boxA +      % +      % Do not prefer a separate line ending with a hyphen to fewer lines. +      \finalhyphendemerits = 0 +      % +      % Word spacing - no stretch +      \spaceskip=\fontdimen2\font minus \fontdimen4\font +      % +      \linepenalty=1000  % Discourage line breaks. +      \hyphenpenalty=5000  % Discourage hyphenation. +      % +      \par % format the paragraph +    \egroup % The \vbox +    \fi    \endgroup +  \dotheinsertentrybox +}} + +\newskip\thinshrinkable +\skip\thinshrinkable=.15em minus .15em + +\newbox\entrybox +\def\insertentrybox{% +  \ourunvbox\entrybox +} + +% default definition +\let\dotheinsertentrybox\insertentrybox + +% Use \lastbox to take apart vbox box by box, and add each sub-box +% to the current vertical list. +\def\ourunvbox#1{% +\bgroup % for local binding of \delayedbox +  % Remove the last box from box #1 +  \global\setbox#1=\vbox{% +    \unvbox#1% +    \unskip % remove any glue +    \unpenalty +    \global\setbox\interbox=\lastbox +  }% +  \setbox\delayedbox=\box\interbox +  \ifdim\ht#1=0pt\else +    \ourunvbox#1 % Repeat on what's left of the box +    \nobreak +  \fi +  \box\delayedbox +\egroup +} +\newbox\delayedbox +\newbox\interbox + +% Used from \printindex.  \firsttoken should be the first token +% after the \entry.  If it's not another \entry, we are at the last +% line of a group of index entries, so insert a penalty to discourage +% widowed index entries. +\def\dotheinsertentryboxwithpenalty{% +  \ifx\firsttoken\isentry +  \else +    \penalty 9000 +  \fi +  \insertentrybox  } +\def\isentry{\entry}%  % 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 1em plus 1fill} +  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll} +  \def\primary #1{\line{#1\hfil}} @@ -4556,7 +5800,11 @@ end    \ifpdf      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.    \else -    #2 +    \ifx\XeTeXrevision\thisisundefined +      #2 +    \else +      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. +    \fi    \fi    \par  }} @@ -4564,12 +5812,37 @@ end  % Define two-column mode, which we use to typeset indexes.  % Adapted from the TeXbook, page 416, which is to say,  % the manmac.tex format used to print the TeXbook itself. -\catcode`\@=11 +\catcode`\@=11  % private names  \newbox\partialpage  \newdimen\doublecolumnhsize +% Use inside an output routine to save \topmark and \firstmark +\def\savemarks{% +  \global\savedtopmark=\expandafter{\topmark }% +  \global\savedfirstmark=\expandafter{\firstmark }% +} +\newtoks\savedtopmark +\newtoks\savedfirstmark + +% Set \topmark and \firstmark for next time \output runs. +% Can't be run from withinside \output (because any material +% added while an output routine is active, including  +% penalties, is saved for after it finishes).  The page so far +% should be empty, otherwise what's on it will be thrown away. +\def\restoremarks{% +  \mark{\the\savedtopmark}% +  \bgroup\output = {% +    \setbox\dummybox=\box\PAGE +  }abc\eject\egroup +  % "abc" because output routine doesn't fire for a completely empty page. +  \mark{\the\savedfirstmark}% +} +  \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns +  % If not much space left on page, start a new page. +  \ifdim\pagetotal>0.8\vsize\vfill\eject\fi +  %    % Grab any single-column material above us.    \output = {%      % @@ -4589,8 +5862,15 @@ end        \unvbox\PAGE        \kern-\topskip \kern\baselineskip      }% +    \savemarks    }%    \eject % run that output routine to set \partialpage +  \restoremarks +  % +  % We recover the two marks that the last output routine saved in order +  % to propagate the information in marks added around a chapter heading, +  % which could be otherwise be lost by the time the final page is output. +  %    %    % Use the double-column output routine for subsequent pages.    \output = {\doublecolumnout}% @@ -4616,27 +5896,31 @@ end      \divide\doublecolumnhsize by 2    \hsize = \doublecolumnhsize    % -  % Double the \vsize as well.  (We don't need a separate register here, -  % since nobody clobbers \vsize.) +  % Double the \vsize as well. +  \advance\vsize by -\ht\partialpage    \vsize = 2\vsize +  % +  % For the benefit of balancing columns +  \advance\baselineskip by 0pt plus 0.5pt  }  % The double-column output routine for all double-column pages except -% the last. +% the last, which is done by \balancecolumns.  %  \def\doublecolumnout{% +  %    \splittopskip=\topskip \splitmaxdepth=\maxdepth    % Get the available space for the double columns -- the normal    % (undoubled) page height minus any material left over from the    % previous page.    \dimen@ = \vsize    \divide\dimen@ by 2 -  \advance\dimen@ by -\ht\partialpage    %    % box0 will be the left-hand column, box2 the right. -  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ +  \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@ +  \global\advance\vsize by 2\ht\partialpage    \onepageout\pagesofar -  \unvbox255 +  \unvbox\PAGE    \penalty\outputpenalty  }  % @@ -4647,10 +5931,11 @@ end    %    \hsize = \doublecolumnhsize    \wd0=\hsize \wd2=\hsize -  \hbox to\pagewidth{\box0\hfil\box2}% +  \hbox to\txipagewidth{\box0\hfil\box2}%  } -% -% All done with double columns. + + +% Finished with with double columns.  \def\enddoublecolumns{%    % The following penalty ensures that the page builder is exercised    % _before_ we change the output routine.  This is necessary in the @@ -4673,7 +5958,7 @@ end    % goal.  When TeX sees \eject from below which follows the final    % section, it invokes the new output routine that we've set after    % \balancecolumns below; \onepageout will try to fit the two columns -  % and the final section into the vbox of \pageheight (see +  % and the final section into the vbox of \txipageheight (see    % \pagebody), causing an overfull box.    %    % Note that glue won't work here, because glue does not exercise the @@ -4681,53 +5966,81 @@ end    \penalty0    %    \output = {% -    % Split the last of the double-column material.  Leave it on the -    % current page, no automatic page break. +    % Split the last of the double-column material. +    \savemarks      \balancecolumns      % -    % If we end up splitting too much material for the current page, -    % though, there will be another page break right after this \output -    % invocation ends.  Having called \balancecolumns once, we do not +    % Having called \balancecolumns once, we do not      % want to call it again.  Therefore, reset \output to its normal -    % definition right away.  (We hope \balancecolumns will never be -    % called on to balance too much material, but if it is, this makes -    % the output somewhat more palatable.) +    % definition right away.      \global\output = {\onepageout{\pagecontents\PAGE}}%    }%    \eject    \endgroup % started in \begindoublecolumns +  \restoremarks +  % Leave the double-column material on the current page, no automatic +  % page break. +  \box\balancedcolumns    %    % \pagegoal was set to the doubled \vsize above, since we restarted    % the current page.  We're now back to normal single-column -  % typesetting, so reset \pagegoal to the normal \vsize (after the -  % \endgroup where \vsize got restored). -  \pagegoal = \vsize +  % typesetting, so reset \pagegoal to the normal \vsize. +  \global\vsize = \txipageheight % +  \pagegoal = \txipageheight %  } +\newbox\balancedcolumns +\setbox\balancedcolumns=\vbox{shouldnt see this}%  % -% Called at the end of the double column material. +% Only called for the last of the double column material.  \doublecolumnout  +% does the others.  \def\balancecolumns{% -  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. +  \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.    \dimen@ = \ht0    \advance\dimen@ by \topskip    \advance\dimen@ by-\baselineskip -  \divide\dimen@ by 2 % target to split to -  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% -  \splittopskip = \topskip -  % Loop until we get a decent breakpoint. -  {% -    \vbadness = 10000 -    \loop -      \global\setbox3 = \copy0 -      \global\setbox1 = \vsplit3 to \dimen@ -    \ifdim\ht3>\dimen@ -      \global\advance\dimen@ by 1pt -    \repeat -  }% -  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% -  \setbox0=\vbox to\dimen@{\unvbox1}% -  \setbox2=\vbox to\dimen@{\unvbox3}% +  \ifdim\dimen@<5\baselineskip +    % Don't split a short final column in two. +    \setbox2=\vbox{}% +  \else +    \divide\dimen@ by 2 % target to split to +    \dimen@ii = \dimen@ +    \splittopskip = \topskip +    % Loop until left column is at least as high as the right column. +    {% +      \vbadness = 10000 +      \loop +        \global\setbox3 = \copy0 +        \global\setbox1 = \vsplit3 to \dimen@ +      \ifdim\ht1<\ht3 +        \global\advance\dimen@ by 1pt +      \repeat +    }% +    % Now the left column is in box 1, and the right column in box 3. +    % Check whether the left column has come out higher than the page itself.   +    % (Note that we have doubled \vsize for the double columns, so +    % the actual height of the page is 0.5\vsize). +    \ifdim2\ht1>\vsize +      % Just split the last of the double column material roughly in half. +      \setbox2=\box0 +      \setbox0 = \vsplit2 to \dimen@ii +      \setbox0=\vbox to \dimen@ii {\unvbox0\vfill}% +      \setbox2=\vbox to \dimen@ii {\unvbox2\vfill}% +    \else +      % Compare the heights of the two columns. +      \ifdim4\ht1>5\ht3 +        % Column heights are too different, so don't make their bottoms +        % flush with each other. +        \setbox2=\vbox to \ht1 {\unvbox3\vfill}% +        \setbox0=\vbox to \ht1 {\unvbox1\vfill}% +      \else +        % Make column bottoms flush with each other. +        \setbox2=\vbox to\ht1{\unvbox3\unskip}% +        \setbox0=\vbox to\ht1{\unvbox1\unskip}% +      \fi +    \fi +  \fi    % -  \pagesofar +  \global\setbox\balancedcolumns=\vbox{\pagesofar}%  }  \catcode`\@ = \other @@ -4735,7 +6048,26 @@ end  \message{sectioning,}  % Chapters, sections, etc. -% \unnumberedno is an oxymoron, of course.  But we count the unnumbered +% Let's start with @part. +\outer\parseargdef\part{\partzzz{#1}} +\def\partzzz#1{% +  \chapoddpage +  \null +  \vskip.3\vsize  % move it down on the page a bit +  \begingroup +    \noindent \titlefonts\rm #1\par % the text +    \let\lastnode=\empty      % no node to associate with +    \writetocentry{part}{#1}{}% but put it in the toc +    \headingsoff              % no headline or footline on the part page +    % This outputs a mark at the end of the page that clears \thischapter +    % and \thissection, as is done in \startcontents. +    \let\pchapsepmacro\relax +    \chapmacro{}{Yomitfromtoc}{}% +    \chapoddpage +  \endgroup +} + +% \unnumberedno is an oxymoron.  But we count the unnumbered  % sections so that we can refer to them unambiguously in the pdf  % outlines by their "section number".  We avoid collisions with chapter  % numbers by starting them at 10000.  (If a document ever has 10000 @@ -4814,8 +6146,8 @@ end  \chardef\maxseclevel = 3  %  % A numbered section within an unnumbered changes to unnumbered too. -% To achive this, remember the "biggest" unnum. sec. we are currently in: -\chardef\unmlevel = \maxseclevel +% To achieve this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unnlevel = \maxseclevel  %  % Trace whether the current chapter is an appendix or not:  % \chapheadtype is "N" or "A", unnumbered chapters are ignored. @@ -4840,8 +6172,8 @@ end    % The heading type:    \def\headtype{#1}%    \if \headtype U% -    \ifnum \absseclevel < \unmlevel -      \chardef\unmlevel = \absseclevel +    \ifnum \absseclevel < \unnlevel +      \chardef\unnlevel = \absseclevel      \fi    \else      % Check for appendix sections: @@ -4853,10 +6185,10 @@ end        \fi\fi      \fi      % Check for numbered within unnumbered: -    \ifnum \absseclevel > \unmlevel +    \ifnum \absseclevel > \unnlevel        \def\headtype{U}%      \else -      \chardef\unmlevel = 3 +      \chardef\unnlevel = 3      \fi    \fi    % Now print the heading: @@ -4910,7 +6242,9 @@ end    \gdef\chaplevelprefix{\the\chapno.}%    \resetallfloatnos    % -  \message{\putwordChapter\space \the\chapno}% +  % \putwordChapter can contain complex things in translations. +  \toks0=\expandafter{\putwordChapter}% +  \message{\the\toks0 \space \the\chapno}%    %    % Write the actual heading.    \chapmacro{#1}{Ynumbered}{\the\chapno}% @@ -4921,15 +6255,17 @@ end    \global\let\subsubsection = \numberedsubsubsec  } -\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz +%  \def\appendixzzz#1{%    \global\secno=0 \global\subsecno=0 \global\subsubsecno=0      \global\advance\appendixno by 1    \gdef\chaplevelprefix{\appendixletter.}%    \resetallfloatnos    % -  \def\appendixnum{\putwordAppendix\space \appendixletter}% -  \message{\appendixnum}% +  % \putwordAppendix can contain complex things in translations. +  \toks0=\expandafter{\putwordAppendix}% +  \message{\the\toks0 \space \appendixletter}%    %    \chapmacro{#1}{Yappendix}{\appendixletter}%    % @@ -4938,7 +6274,8 @@ end    \global\let\subsubsection = \appendixsubsubsec  } -\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +% normally unnmhead0 calls unnumberedzzz: +\outer\parseargdef\unnumbered{\unnmhead0{#1}}  \def\unnumberedzzz#1{%    \global\secno=0 \global\subsecno=0 \global\subsubsecno=0      \global\advance\unnumberedno by 1 @@ -4970,9 +6307,6 @@ end  % @centerchap is like @unnumbered, but the heading is centered.  \outer\parseargdef\centerchap{% -  % Well, we could do the following in a group, but that would break -  % an assumption that \chapmacro is called at the outermost level. -  % Thus we are safer this way:		--kasal, 24feb04    \let\centerparametersmaybe = \centerparameters    \unnmhead0{#1}%    \let\centerparametersmaybe = \relax @@ -4982,40 +6316,47 @@ end  \let\top\unnumbered  % Sections. +%   \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz  \def\seczzz#1{%    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%  } -\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +% normally calls appendixsectionzzz: +\outer\parseargdef\appendixsection{\apphead1{#1}}  \def\appendixsectionzzz#1{%    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%  }  \let\appendixsec\appendixsection -\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +% normally calls unnumberedseczzz: +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}  \def\unnumberedseczzz#1{%    \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1    \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%  }  % Subsections. -\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +%  +% normally calls numberedsubseczzz: +\outer\parseargdef\numberedsubsec{\numhead2{#1}}  \def\numberedsubseczzz#1{%    \global\subsubsecno=0  \global\advance\subsecno by 1    \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%  } -\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +% normally calls appendixsubseczzz: +\outer\parseargdef\appendixsubsec{\apphead2{#1}}  \def\appendixsubseczzz#1{%    \global\subsubsecno=0  \global\advance\subsecno by 1    \sectionheading{#1}{subsec}{Yappendix}%                   {\appendixletter.\the\secno.\the\subsecno}%  } -\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +% normally calls unnumberedsubseczzz: +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}  \def\unnumberedsubseczzz#1{%    \global\subsubsecno=0  \global\advance\subsecno by 1    \sectionheading{#1}{subsec}{Ynothing}% @@ -5023,21 +6364,25 @@ end  }  % Subsubsections. -\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +%  +% normally numberedsubsubseczzz: +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}  \def\numberedsubsubseczzz#1{%    \global\advance\subsubsecno by 1    \sectionheading{#1}{subsubsec}{Ynumbered}%                   {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%  } -\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +% normally appendixsubsubseczzz: +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}  \def\appendixsubsubseczzz#1{%    \global\advance\subsubsecno by 1    \sectionheading{#1}{subsubsec}{Yappendix}%                   {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%  } -\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +% normally unnumberedsubsubseczzz: +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}  \def\unnumberedsubsubseczzz#1{%    \global\advance\subsubsecno by 1    \sectionheading{#1}{subsubsec}{Ynothing}% @@ -5053,15 +6398,6 @@ end  % Define @majorheading, @heading and @subheading -% NOTE on use of \vbox for chapter headings, section headings, and such: -%       1) We use \vbox rather than the earlier \line to permit -%          overlong headings to fold. -%       2) \hyphenpenalty is set to 10000 because hyphenation in a -%          heading is obnoxious; this forbids it. -%       3) Likewise, headings look best if no \parindent is used, and -%          if justification is not attempted.  Hence \raggedright. - -  \def\majorheading{%    {\advance\chapheadingskip by 10pt \chapbreak }%    \parsearg\chapheadingzzz @@ -5069,10 +6405,8 @@ end  \def\chapheading{\chapbreak \parsearg\chapheadingzzz}  \def\chapheadingzzz#1{% -  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 -                    \parindent=0pt\raggedright -                    \rm #1\hfill}}% -  \bigskip \par\penalty 200\relax +  \vbox{\chapfonts \raggedtitlesettings #1\par}% +  \nobreak\bigskip \nobreak    \suppressfirstparagraphindent  } @@ -5088,16 +6422,19 @@ end  % (including whitespace, linebreaking, etc. around it),  % given all the information in convenient, parsed form. -%%% Args are the skip and penalty (usually negative) +% Args are the skip and penalty (usually negative)  \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} -%%% Define plain chapter starts, and page on/off switching for it  % Parameter controlling skip before chapter headings (if needed) -  \newskip\chapheadingskip +% Define plain chapter starts, and page on/off switching for it.  \def\chapbreak{\dobreak \chapheadingskip {-4000}} + +% Start a new page  \def\chappager{\par\vfill\supereject} + +% \chapoddpage - start on an odd page for a new chapter  % Because \domark is called before \chapoddpage, the filler page will  % get the headings for the next chapter, which is wrong.  But we don't  % care -- we just disable all headings on the filler page. @@ -5105,15 +6442,14 @@ end    \chappager    \ifodd\pageno \else      \begingroup -      \evenheadline={\hfil}\evenfootline={\hfil}% -      \oddheadline={\hfil}\oddfootline={\hfil}% -      \hbox to 0pt{}% +      \headingsoff +      \null        \chappager      \endgroup    \fi  } -\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} +\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}  \def\CHAPPAGoff{%  \global\let\contentsalignmacro = \chappager @@ -5134,17 +6470,26 @@ end  \CHAPPAGon -% Chapter opening. +% \chapmacro - Chapter opening.  %  % #1 is the text, #2 is the section type (Ynumbered, Ynothing,  % Yappendix, Yomitfromtoc), #3 the chapter number. +% Not used for @heading series.  %  % To test against our argument.  \def\Ynothingkeyword{Ynothing} -\def\Yomitfromtockeyword{Yomitfromtoc}  \def\Yappendixkeyword{Yappendix} +\def\Yomitfromtockeyword{Yomitfromtoc}  %  \def\chapmacro#1#2#3{% +  \expandafter\ifx\thisenv\titlepage\else +    \checkenv{}% chapters, etc., should not start inside an environment. +  \fi +  % FIXME: \chapmacro is currently called from inside \titlepage when +  % \setcontentsaftertitlepage to print the "Table of Contents" heading, but +  % this should probably be done by \sectionheading with an option to print +  % in chapter size. +  %    % Insert the first mark before the heading break (see notes for \domark).    \let\prevchapterdefs=\lastchapterdefs    \let\prevsectiondefs=\lastsectiondefs @@ -5163,7 +6508,10 @@ end      \xdef\lastchapterdefs{%        \gdef\noexpand\thischaptername{\the\toks0}%        \gdef\noexpand\thischapternum{\appendixletter}% -      \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum: +      % \noexpand\putwordAppendix avoids expanding indigestible +      % commands in some of the translations. +      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} +                                 \noexpand\thischapternum:                                   \noexpand\thischaptername}%      }%    \else @@ -5171,7 +6519,10 @@ end      \xdef\lastchapterdefs{%        \gdef\noexpand\thischaptername{\the\toks0}%        \gdef\noexpand\thischapternum{\the\chapno}% -      \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum: +      % \noexpand\putwordChapter avoids expanding indigestible +      % commands in some of the translations. +      \gdef\noexpand\thischapter{\noexpand\putwordChapter{} +                                 \noexpand\thischapternum:                                   \noexpand\thischaptername}%      }%    \fi\fi\fi @@ -5191,6 +6542,7 @@ end    %    {%      \chapfonts \rm +    \let\footnote=\errfootnoteheading % give better error message      %      % Have to define \lastsection before calling \donoderef, because the      % xref code eventually uses it.  On the other hand, it has to be called @@ -5227,8 +6579,7 @@ end      %      % Typeset the actual heading.      \nobreak % Avoid page breaks at the interline glue. -    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright -          \hangindent=\wd0 \centerparametersmaybe +    \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe            \unhbox0 #1\par}%    }%    \nobreak\bigskip % no page break after a chapter title @@ -5244,30 +6595,6 @@ end  } -% I don't think this chapter style is supported any more, so I'm not -% updating it with the new noderef stuff.  We'll see.  --karl, 11aug03. -% -\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} -% -\def\unnchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 -                       \parindent=0pt\raggedright -                       \rm #1\hfill}}\bigskip \par\nobreak -} -\def\chfopen #1#2{\chapoddpage {\chapfonts -\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% -\par\penalty 5000 % -} -\def\centerchfopen #1{% -\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 -                       \parindent=0pt -                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak -} -\def\CHAPFopen{% -  \global\let\chapmacro=\chfopen -  \global\let\centerchapmacro=\centerchfopen} - -  % Section titles.  These macros combine the section number parts and  % call the generic \sectionheading to do the printing.  % @@ -5285,20 +6612,29 @@ end  % Print any size, any type, section title.  % -% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is -% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the -% section number. +% #1 is the text of the title, +% #2 is the section level (sec/subsec/subsubsec), +% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), +% #4 is the section number.  %  \def\seckeyword{sec}  %  \def\sectionheading#1#2#3#4{%    {% -    % Switch to the right set of fonts. -    \csname #2fonts\endcsname \rm -    %      \def\sectionlevel{#2}%      \def\temptype{#3}%      % +    % It is ok for the @heading series commands to appear inside an +    % environment (it's been historically allowed, though the logic is +    % dubious), but not the others. +    \ifx\temptype\Yomitfromtockeyword\else +      \checkenv{}% non-@*heading should not be in an environment. +    \fi +    \let\footnote=\errfootnoteheading +    % +    % Switch to the right set of fonts. +    \csname #2fonts\endcsname \rm +    %      % Insert first mark before the heading break (see notes for \domark).      \let\prevsectiondefs=\lastsectiondefs      \ifx\temptype\Ynothingkeyword @@ -5314,7 +6650,10 @@ end          \xdef\lastsectiondefs{%            \gdef\noexpand\thissectionname{\the\toks0}%            \gdef\noexpand\thissectionnum{#4}% -          \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: +          % \noexpand\putwordSection avoids expanding indigestible +          % commands in some of the translations. +          \gdef\noexpand\thissection{\noexpand\putwordSection{} +                                     \noexpand\thissectionnum:                                       \noexpand\thissectionname}%          }%        \fi @@ -5324,12 +6663,20 @@ end          \xdef\lastsectiondefs{%            \gdef\noexpand\thissectionname{\the\toks0}%            \gdef\noexpand\thissectionnum{#4}% -          \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum: +          % \noexpand\putwordSection avoids expanding indigestible +          % commands in some of the translations. +          \gdef\noexpand\thissection{\noexpand\putwordSection{} +                                     \noexpand\thissectionnum:                                       \noexpand\thissectionname}%          }%        \fi      \fi\fi\fi      % +    % Go into vertical mode.  Usually we'll already be there, but we +    % don't want the following whatsit to end up in a preceding paragraph +    % if the document didn't happen to have a blank line. +    \par +    %      % Output the mark.  Pass it through \safewhatsit, to take care of      % the preceding space.      \safewhatsit\domark @@ -5339,7 +6686,7 @@ end      %      % Now the second mark, after the heading break.  No break points      % between here and the heading. -    \let\prevsectiondefs=\lastsectiondefs +    \global\let\prevsectiondefs=\lastsectiondefs      \domark      %      % Only insert the space after the number if we have a section number. @@ -5379,7 +6726,7 @@ end      \nobreak      %      % Output the actual section heading. -    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright +    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright            \hangindent=\wd0  % zero if no section number            \unhbox0 #1}%    }% @@ -5393,15 +6740,15 @@ end    %    % We'll almost certainly start a paragraph next, so don't let that    % glue accumulate.  (Not a breakpoint because it's preceded by a -  % discardable item.) +  % discardable item.)  However, when a paragraph is not started next +  % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out +  % or the negative glue will cause weirdly wrong output, typically +  % obscuring the section heading with something else.    \vskip-\parskip -  %  -  % This is purely so the last item on the list is a known \penalty > -  % 10000.  This is so \startdefun can avoid allowing breakpoints after -  % section headings.  Otherwise, it would insert a valid breakpoint between: -  %  -  %   @section sec-whatever -  %   @deffn def-whatever +  % +  % This is so the last item on the main vertical list is a known +  % \penalty > 10000, so \startdefun, etc., can recognize the situation +  % and do the needful.    \penalty 10001  } @@ -5450,14 +6797,21 @@ end    % 1 and 2 (the page numbers aren't printed), and so are the first    % two pages of the document.  Thus, we'd have two destinations named    % `1', and two named `2'. -  \ifpdf \global\pdfmakepagedesttrue \fi +  \ifpdf +    \global\pdfmakepagedesttrue +  \else +    \ifx\XeTeXrevision\thisisundefined +    \else +      \global\pdfmakepagedesttrue +    \fi +  \fi  }  % These characters do not print properly in the Computer Modern roman  % fonts, so we must take special care.  This is more or less redundant  % with the Texinfo input format setup at the end of this file. -%  +%  \def\activecatcodes{%    \catcode`\"=\active    \catcode`\$=\active @@ -5499,7 +6853,7 @@ end    \savepageno = \pageno    \begingroup                  % Set up to handle contents files properly.      \raggedbottom              % Worry more about breakpoints than the bottom. -    \advance\hsize by -\contentsrightmargin % Don't use the full line length. +    \entryrightmargin=\contentsrightmargin % Don't use the full line length.      %      % Roman numerals for page numbers.      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi @@ -5507,7 +6861,7 @@ end  % redefined for the two-volume lispref.  We always output on  % \jobname.toc even if this is redefined. -%  +%  \def\tocreadfilename{\jobname.toc}  % Normal (long) toc. @@ -5533,6 +6887,7 @@ end  \def\summarycontents{%    \startcontents{\putwordShortTOC}%      % +    \let\partentry = \shortpartentry      \let\numchapentry = \shortchapentry      \let\appentry = \shortchapentry      \let\unnchapentry = \shortunnchapentry @@ -5588,9 +6943,30 @@ end  % 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. +% Also ignore the page number, which is conventionally not printed. +\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} +\def\partentry#1#2#3#4{% +  % Add stretch and a bonus for breaking the page before the part heading. +  % This reduces the chance of the page being broken immediately after the +  % part heading, before a following chapter heading. +  \vskip 0pt plus 5\baselineskip +  \penalty-300 +  \vskip 0pt plus -5\baselineskip +  \dochapentry{\numeralbox\labelspace#1}{}% +} +% +% Parts, in the short toc. +\def\shortpartentry#1#2#3#4{% +  \penalty-300 +  \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip +  \shortchapentry{{\bf #1}}{\numeralbox}{}{}% +} +  % Chapters, in the main contents.  \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{% @@ -5605,7 +6981,7 @@ end    \setbox0 = \hbox{\putwordAppendix{} M}%    \hbox to \wd0{\putwordAppendix{} #1\hss}}  % -\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#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}} @@ -5638,6 +7014,8 @@ end  \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       \tocentry{#1}{\dopageno\bgroup#2\egroup}%     \endgroup @@ -5677,46 +7055,12 @@ end  \message{environments,}  % @foo ... @end foo. -% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. -% -% Since these characters are used in examples, they should be an even number of -% \tt widths. Each \tt character is 1en, so two makes it 1em. -% -\def\point{$\star$} -\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} -\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} -\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} -\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} -\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} - -% The @error{} command. -% Adapted from the TeXbook's \boxit. -% -\newbox\errorbox -% -{\tentt \global\dimen0 = 3em}% Width of the box. -\dimen2 = .55pt % Thickness of rules -% The text. (`r' is open on the right, `e' somewhat less so on the left.) -\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt} -% -\setbox\errorbox=\hbox to \dimen0{\hfil -   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. -   \advance\hsize by -2\dimen2 % Rules. -   \vbox{% -      \hrule height\dimen2 -      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text. -         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. -         \kern3pt\vrule width\dimen2}% Space to right. -      \hrule height\dimen2} -    \hfil} -% -\def\error{\leavevmode\lower.7ex\copy\errorbox} - -% @tex ... @end tex    escapes into raw Tex temporarily. +% @tex ... @end tex    escapes into raw TeX temporarily.  % One exception: @ is still an escape character, so that @end tex works. -% But \@ or @@ will get a plain tex @ character. +% But \@ or @@ will get a plain @ character.  \envdef\tex{% +  \setupmarkupstyle{tex}%    \catcode `\\=0 \catcode `\{=1 \catcode `\}=2    \catcode `\$=3 \catcode `\&=4 \catcode `\#=6    \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie @@ -5726,8 +7070,14 @@ end    \catcode `\|=\other    \catcode `\<=\other    \catcode `\>=\other -  \escapechar=`\\ +  \catcode `\`=\other +  \catcode `\'=\other    % +  % ' is active in math mode (mathcode"8000).  So reset it, and all our +  % other math active characters (just in case), to plain's definitions. +  \mathactive +  % +  % Inverse of the list at the beginning of the file.    \let\b=\ptexb    \let\bullet=\ptexbullet    \let\c=\ptexc @@ -5743,9 +7093,11 @@ end    \let\+=\tabalign    \let\}=\ptexrbrace    \let\/=\ptexslash +  \let\sp=\ptexsp    \let\*=\ptexstar +  %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode    \let\t=\ptext -  \expandafter \let\csname top\endcsname=\ptextop  % outer +  \expandafter \let\csname top\endcsname=\ptextop  % we've made it outer    \let\frenchspacing=\plainfrenchspacing    %    \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% @@ -5782,6 +7134,24 @@ end      \endgraf      \ifdim\lastskip<\envskipamount        \removelastskip +      \ifnum\lastpenalty<10000 +        % Penalize breaking before the environment, because preceding text +        % often leads into it. +        \penalty100 +      \fi +      \vskip\envskipamount +    \fi +  \fi +}} + +\def\afterenvbreak{{% +  % =10000 instead of <10000 because of a special case in \itemzzz and +  % \sectionheading, q.v. +  \ifnum \lastpenalty=10000 \else +    \advance\envskipamount by \parskip +    \endgraf +    \ifdim\lastskip<\envskipamount +      \removelastskip        % it's not a good place to break if the last penalty was \nobreak        % or better ...        \ifnum\lastpenalty<10000 \penalty-50 \fi @@ -5790,8 +7160,6 @@ end    \fi  }} -\let\afterenvbreak = \aboveenvbreak -  % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will  % also clear it, so that its embedded environments do the narrowing again.  \let\nonarrowing=\relax @@ -5829,9 +7197,13 @@ end  				% side, and for 6pt waste from  				% each corner char, and rule thickness    \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip -  % Flag to tell @lisp, etc., not to narrow margin. -  \let\nonarrowing = t% -  \vbox\bgroup +  % +  % If this cartouche directly follows a sectioning command, we need the +  % \parskip glue (backspaced over by default) or the cartouche can +  % collide with the section heading. +  \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi +  % +  \setbox\groupbox=\vbox\bgroup        \baselineskip=0pt\parskip=0pt\lineskip=0pt        \carttop        \hbox\bgroup @@ -5844,7 +7216,7 @@ end  	      \lineskip=\normlskip  	      \parskip=\normpskip  	      \vskip -\parskip -	      \comment % For explanation, see the end of \def\group. +	      \comment % For explanation, see the end of def\group.  }  \def\Ecartouche{%                \ifhmode\par\fi @@ -5855,20 +7227,27 @@ end        \egroup        \cartbot    \egroup +  \addgroupbox    \checkinserts  }  % This macro is called at the beginning of all the @example variants,  % inside a group. +\newdimen\nonfillparindent  \def\nonfillstart{%    \aboveenvbreak -  \hfuzz = 12pt % Don't be fussy +  \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy    \sepspaces % Make spaces be word-separators rather than space tokens.    \let\par = \lisppar % don't ignore blank lines    \obeylines % each line of input is a line of output    \parskip = 0pt +  % Turn off paragraph indentation but redefine \indent to emulate +  % the normal \indent. +  \nonfillparindent=\parindent    \parindent = 0pt +  \let\indent\nonfillindent +  %    \emergencystretch = 0pt % don't try to avoid overfull boxes    \ifx\nonarrowing\relax      \advance \leftskip by \lispnarrowing @@ -5879,6 +7258,24 @@ end    \let\exdent=\nofillexdent  } +\begingroup +\obeyspaces +% We want to swallow spaces (but not other tokens) after the fake +% @indent in our nonfill-environments, where spaces are normally +% active and set to @tie, resulting in them not being ignored after +% @indent. +\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% +\gdef\nonfillindentcheck{% +\ifx\temp % +\expandafter\nonfillindentgobble% +\else% +\leavevmode\nonfillindentbox% +\fi% +}% +\endgroup +\def\nonfillindentgobble#1{\nonfillindent} +\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} +  % 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: @@ -5906,41 +7303,42 @@ end  }  % We often define two environments, @foo and @smallfoo. -% Let's do it by one command: -\def\makedispenv #1#2{ -  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} -  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} +% Let's do it in one command.  #1 is the env name, #2 the definition. +\def\makedispenvdef#1#2{% +  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% +  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%    \expandafter\let\csname E#1\endcsname \afterenvbreak    \expandafter\let\csname Esmall#1\endcsname \afterenvbreak  } -% Define two synonyms: -\def\maketwodispenvs #1#2#3{ -  \makedispenv{#1}{#3} -  \makedispenv{#2}{#3} +% Define two environment synonyms (#1 and #2) for an environment. +\def\maketwodispenvdef#1#2#3{% +  \makedispenvdef{#1}{#3}% +  \makedispenvdef{#2}{#3}%  } - -% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @lisp: indented, narrowed, typewriter font; +% @example: same as @lisp.  %  % @smallexample and @smalllisp: use smaller fonts.  % Originally contributed by Pavel@xerox.  % -\maketwodispenvs {lisp}{example}{% +\maketwodispenvdef{lisp}{example}{%    \nonfillstart -  \tt\quoteexpand +  \tt\setupmarkupstyle{example}%    \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. -  \gobble       % eat return +  \gobble % eat return  }  % @display/@smalldisplay: same as @lisp except keep current font.  % -\makedispenv {display}{% +\makedispenvdef{display}{%    \nonfillstart    \gobble  }  % @format/@smallformat: same as @display except don't narrow margins.  % -\makedispenv{format}{% +\makedispenvdef{format}{%    \let\nonarrowing = t%    \nonfillstart    \gobble @@ -5959,28 +7357,51 @@ end  \envdef\flushright{%    \let\nonarrowing = t%    \nonfillstart -  \advance\leftskip by 0pt plus 1fill +  \advance\leftskip by 0pt plus 1fill\relax    \gobble  }  \let\Eflushright = \afterenvbreak +% @raggedright does more-or-less normal line breaking but no right +% justification.  From plain.tex.  Don't stretch around special +% characters in urls in this environment, since the stretch at the right +% should be enough. +\envdef\raggedright{% +  \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax +  \def\urefprestretchamount{0pt}% +  \def\urefpoststretchamount{0pt}% +} +\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  % we're doing normal filling.  So, when using \aboveenvbreak and  % \afterenvbreak, temporarily make \parskip 0.  % -\envdef\quotation{% -  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip -  \parindent=0pt -  % -  % @cartouche defines \nonarrowing to inhibit narrowing at next level down. +\makedispenvdef{quotation}{\quotationstart} +% +\def\quotationstart{% +  \indentedblockstart % same as \indentedblock, but increase right margin too.    \ifx\nonarrowing\relax -    \advance\leftskip by \lispnarrowing      \advance\rightskip by \lispnarrowing -    \exdentamount = \lispnarrowing -  \else -    \let\nonarrowing = \relax    \fi    \parsearg\quotationlabel  } @@ -5990,12 +7411,13 @@ end  %  \def\Equotation{%    \par -  \ifx\quotationauthor\undefined\else +  \ifx\quotationauthor\thisisundefined\else      % indent a bit.      \leftline{\kern 2\leftskip \sl ---\quotationauthor}%    \fi    {\parskip=0pt \afterenvbreak}%  } +\def\Esmallquotation{\Equotation}  % If we're given an argument, typeset it in bold with a colon after.  \def\quotationlabel#1{% @@ -6005,6 +7427,32 @@ end    \fi  } +% @indentedblock is like @quotation, but indents only on the left and +% has no optional argument. +%  +\makedispenvdef{indentedblock}{\indentedblockstart} +% +\def\indentedblockstart{% +  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip +  \parindent=0pt +  % +  % @cartouche defines \nonarrowing to inhibit narrowing at next level down. +  \ifx\nonarrowing\relax +    \advance\leftskip by \lispnarrowing +    \exdentamount = \lispnarrowing +  \else +    \let\nonarrowing = \relax +  \fi +} + +% Keep a nonzero parskip for the environment, since we're doing normal filling. +% +\def\Eindentedblock{% +  \par +  {\parskip=0pt \afterenvbreak}% +} +\def\Esmallindentedblock{\Eindentedblock} +  % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}  % If we want to allow any <char> as delimiter, @@ -6020,18 +7468,16 @@ end    \do\ \do\\\do\{\do\}\do\$\do\&%    \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%    \do\<\do\>\do\|\do\@\do+\do\"% +  % Don't do the quotes -- if we do, @set txicodequoteundirected and +  % @set txicodequotebacktick will not have effect on @verb and +  % @verbatim, and ?` and !` ligatures won't get disabled. +  %\do\`\do\'%  }  %  % [Knuth] p. 380  \def\uncatcodespecials{%    \def\do##1{\catcode`##1=\other}\dospecials}  % -% [Knuth] pp. 380,381,391 -% Disable Spanish ligatures ?` and !` of \tt font -\begingroup -  \catcode`\`=\active\gdef`{\relax\lq} -\endgroup -%  % Setup for the @verb command.  %  % Eight spaces for a tab @@ -6043,7 +7489,7 @@ end  \def\setupverb{%    \tt  % easiest (and conventionally used) font for verbatim    \def\par{\leavevmode\endgraf}% -  \catcode`\`=\active +  \setupmarkupstyle{verb}%    \tabeightspaces    % Respect line breaks,    % print special symbols as themselves, and @@ -6054,73 +7500,46 @@ end  % Setup for the @verbatim environment  % -% Real tab expansion +% Real tab expansion.  \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount  % -\def\starttabbox{\setbox0=\hbox\bgroup} - -% Allow an option to not replace quotes with a regular directed right -% quote/apostrophe (char 0x27), but instead use 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{% -  \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax -    \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax -      '% -    \else \char'15 \fi -  \else \char'15 \fi -} -% -% 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{% -  \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax -    \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax -      `% -    \else \char'22 \fi -  \else \char'22 \fi -} +% We typeset each line of the verbatim in an \hbox, so we can handle +% tabs.  The \global is in case the verbatim line starts with an accent, +% or some other command that starts with a begin-group.  Otherwise, the +% entire \verbbox would disappear at the corresponding end-group, before +% it is typeset.  Meanwhile, we can't have nested verbatim commands +% (can we?), so the \global won't be overwriting itself. +\newbox\verbbox +\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}  %  \begingroup    \catcode`\^^I=\active    \gdef\tabexpand{%      \catcode`\^^I=\active      \def^^I{\leavevmode\egroup -      \dimen0=\wd0 % the width so far, or since the previous tab -      \divide\dimen0 by\tabw -      \multiply\dimen0 by\tabw % compute previous multiple of \tabw -      \advance\dimen0 by\tabw  % advance to next multiple of \tabw -      \wd0=\dimen0 \box0 \starttabbox +      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab +      \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 \box\verbbox \starttabbox      }%    } -  \catcode`\'=\active -  \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}% -  % -  \catcode`\`=\active -  \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}% -  % -  \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%  \endgroup  % start the verbatim environment.  \def\setupverbatim{%    \let\nonarrowing = t%    \nonfillstart -  % Easiest (and conventionally used) font for verbatim -  \tt -  \def\par{\leavevmode\egroup\box0\endgraf}% -  \catcode`\`=\active +  \tt % easiest (and conventionally used) font for verbatim +  % The \leavevmode here is for blank lines.  Otherwise, we would +  % never \starttabox and the \egroup would end verbatim mode. +  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%    \tabexpand -  \quoteexpand +  \setupmarkupstyle{verbatim}%    % Respect line breaks,    % print special symbols as themselves, and -  % make each space count -  % must do in this order: +  % make each space count. +  % Must do in this order:    \obeylines \uncatcodespecials \sepspaces    \everypar{\starttabbox}%  } @@ -6176,6 +7595,8 @@ end    {%      \makevalueexpandable      \setupverbatim +    \indexnofonts       % Allow `@@' and other weird things in file names. +    \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%      \input #1      \afterenvbreak    }% @@ -6189,7 +7610,7 @@ end  % typesetting commands (@smallbook, font changes, etc.) have to be done  % beforehand -- and a) we want @copying to be done first in the source  % file; b) letting users define the frontmatter in as flexible order as -% possible is very desirable. +% possible is desirable.  %  \def\copying{\checkenv{}\begingroup\scanargctxt\docopying}  \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} @@ -6225,7 +7646,7 @@ end      % commands also insert a nobreak penalty, and we don't want to allow      % a break between a section heading and a defun.      % -    % As a minor refinement, we avoid "club" headers by signalling +    % As a further refinement, we avoid "club" headers by signalling      % with penalty of 10003 after the very first @deffn in the      % sequence (see above), and penalty of 10002 after any following      % @def command. @@ -6262,7 +7683,7 @@ end      #1#2 \endheader      % common ending:      \interlinepenalty = 10000 -    \advance\rightskip by 0pt plus 1fil +    \advance\rightskip by 0pt plus 1fil\relax      \endgraf      \nobreak\vskip -\parskip      \penalty\defunpenalty  % signal to \startdefun and \dodefunx @@ -6284,7 +7705,7 @@ end    \temp  } -% \domakedefun \deffn \deffnx \deffnheader +% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }  %  % Define \deffn and \deffnx, without parameters.  % \deffnheader has to be defined explicitly. @@ -6292,13 +7713,36 @@ end  \def\domakedefun#1#2#3{%    \envdef#1{%      \startdefun +    \doingtypefnfalse    % distinguish typed functions from all else      \parseargusing\activeparens{\printdefunline#3}%    }%    \def#2{\dodefunx#1}%    \def#3%  } -%%% Untyped functions: +\newif\ifdoingtypefn       % doing typed function? +\newif\ifrettypeownline    % typeset return type on its own line? + +% @deftypefnnewline on|off says whether the return type of typed functions +% are printed on their own line.  This affects @deftypefn, @deftypefun, +% @deftypeop, and @deftypemethod. +%  +\parseargdef\deftypefnnewline{% +  \def\temp{#1}% +  \ifx\temp\onword +    \expandafter\let\csname SETtxideftypefnnl\endcsname +      = \empty +  \else\ifx\temp\offword +    \expandafter\let\csname SETtxideftypefnnl\endcsname +      = \relax +  \else +    \errhelp = \EMsimple +    \errmessage{Unknown @txideftypefnnl value `\temp', +                must be on|off}% +  \fi\fi +} + +% Untyped functions:  % @deffn category name args  \makedefun{deffn}{\deffngeneral{}} @@ -6317,7 +7761,7 @@ end    \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%  } -%%% Typed functions: +% Typed functions:  % @deftypefn category type name args  \makedefun{deftypefn}{\deftypefngeneral{}} @@ -6332,10 +7776,11 @@ end  %  \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%    \dosubind{fn}{\code{#4}}{#1}% +  \doingtypefntrue    \defname{#2}{#3}{#4}\defunargs{#5\unskip}%  } -%%% Typed variables: +% Typed variables:  % @deftypevr category type var args  \makedefun{deftypevr}{\deftypecvgeneral{}} @@ -6353,7 +7798,7 @@ end    \defname{#2}{#3}{#4}\defunargs{#5\unskip}%  } -%%% Untyped variables: +% Untyped variables:  % @defvr category var args  \makedefun{defvr}#1 {\deftypevrheader{#1} {} } @@ -6364,7 +7809,8 @@ end  % \defcvof {category of}class var args  \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } -%%% Type: +% Types: +  % @deftp category name args  \makedefun{deftp}#1 #2 #3\endheader{%    \doind{tp}{\code{#2}}% @@ -6392,25 +7838,49 @@ end  % We are followed by (but not passed) the arguments, if any.  %  \def\defname#1#2#3{% +  \par    % Get the values of \leftskip and \rightskip as they were outside the @def...    \advance\leftskip by -\defbodyindent    % -  % How we'll format the type name.  Putting it in brackets helps +  % Determine if we are typesetting the return type of a typed function +  % on a line by itself. +  \rettypeownlinefalse +  \ifdoingtypefn  % doing a typed function specifically? +    % then check user option for putting return type on its own line: +    \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else +      \rettypeownlinetrue +    \fi +  \fi +  % +  % How we'll format the category name.  Putting it in brackets helps    % distinguish it from the body text that may end up on the next line    % just below it.    \def\temp{#1}%    \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}    % -  % Figure out line sizes for the paragraph shape. +  % Figure out line sizes for the paragraph shape.  We'll always have at +  % least two. +  \tempnum = 2 +  %    % The first line needs space for \box0; but if \rightskip is nonzero,    % we need only space for the part of \box0 which exceeds it:    \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip +  % +  % If doing a return type on its own line, we'll have another line. +  \ifrettypeownline +    \advance\tempnum by 1 +    \def\maybeshapeline{0in \hsize}% +  \else +    \def\maybeshapeline{}% +  \fi +  %    % The continuations:    \dimen2=\hsize  \advance\dimen2 by -\defargsindent -  % (plain.tex says that \dimen1 should be used only as global.) -  \parshape 2 0in \dimen0 \defargsindent \dimen2    % -  % Put the type name to the right margin. +  % The final paragraph shape: +  \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2 +  % +  % Put the category name at the right margin.    \noindent    \hbox to 0pt{%      \hfil\box0 \kern-\hsize @@ -6432,11 +7902,19 @@ end      % . this still does not fix the ?` and !` ligatures, but so far no      %   one has made identifiers using them :).      \df \tt -    \def\temp{#2}% return value type -    \ifx\temp\empty\else \tclose{\temp} \fi +    \def\temp{#2}% text of the return type +    \ifx\temp\empty\else +      \tclose{\temp}% typeset the return type +      \ifrettypeownline +        % put return type on its own line; prohibit line break following: +        \hfil\vadjust{\nobreak}\break   +      \else +        \space  % type on same line, so just followed by a space +      \fi +    \fi           % no return type      #3% output function name    }% -  {\rm\enskip}% hskip 0.5 em of \tenrm +  {\rm\enskip}% hskip 0.5 em of \rmfont    %    \boldbrax    % arguments will be output next, if any. @@ -6453,8 +7931,11 @@ end    \df \sl \hyphenchar\font=0    %    % On the other hand, if an argument has two dashes (for instance), we -  % want a way to get ttsl.  Let's try @var for that. -  \let\var=\ttslanted +  % 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  } @@ -6551,7 +8032,7 @@ end  % To do this right we need a feature of e-TeX, \scantokens,  % which we arrange to emulate with a temporary file in ordinary TeX. -\ifx\eTeXversion\undefined +\ifx\eTeXversion\thisisundefined    \newwrite\macscribble    \def\scantokens#1{%      \toks0={#1}% @@ -6562,29 +8043,41 @@ end    }  \fi +% alias because \c means cedilla in @tex or @math +\let\texinfoc=\c + +\newcount\savedcatcodeone +\newcount\savedcatcodetwo + +% Used at the time of macro expansion. +% Argument is macro body with arguments substituted  \def\scanmacro#1{% -  \begingroup -    \newlinechar`\^^M -    \let\xeatspaces\eatspaces -    % Undo catcode changes of \startcontents and \doprintindex -    % When called from @insertcopying or (short)caption, we need active -    % backslash to get it printed correctly.  Previously, we had -    % \catcode`\\=\other instead.  We'll see whether a problem appears -    % with macro expansion.				--kasal, 19aug04 -    \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ -    % ... and \example -    \spaceisspace -    % -    % Append \endinput to make sure that TeX does not see the ending newline. -    % I've verified that it is necessary both for e-TeX and for ordinary TeX -    %							--kasal, 29nov03 -    \scantokens{#1\endinput}% -  \endgroup +  \newlinechar`\^^M +  \def\xeatspaces{\eatspaces}% +  % +  % Temporarily undo catcode changes of \printindex.  Set catcode of @ to +  % 0 so that @-commands in macro expansions aren't printed literally when  +  % formatting an index file, where \ is used as the escape character. +  \savedcatcodeone=\catcode`\@ +  \savedcatcodetwo=\catcode`\\ +  \catcode`\@=0 +  \catcode`\\=\active +  % +  % Process the macro body under the current catcode regime. +  \scantokens{#1@texinfoc}% +  % +  \catcode`\@=\savedcatcodeone +  \catcode`\\=\savedcatcodetwo +  % +  % The \texinfoc is to remove the \newlinechar added by \scantokens, and +  % can be noticed by \parsearg. +  %   We avoid surrounding the call to \scantokens with \bgroup and \egroup +  % to allow macros to open or close groups themselves.  } +% Used for copying and captions  \def\scanexp#1{% -  \edef\temp{\noexpand\scanmacro{#1}}% -  \temp +  \expandafter\scanmacro\expandafter{#1}%  }  \newcount\paramno   % Count of parameters @@ -6592,7 +8085,7 @@ end  \newif\ifrecursive  % Is it recursive?  % List of all defined macros in the form -%    \definedummyword\macro1\definedummyword\macro2... +%    \commondummyword\macro1\commondummyword\macro2...  % Currently is also contains all @aliases; the list can be split  % if there is a need.  \def\macrolist{} @@ -6600,7 +8093,7 @@ end  % Add the macro to \macrolist  \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}  \def\addtomacrolistxxx#1{% -     \toks0 = \expandafter{\macrolist\definedummyword#1}% +     \toks0 = \expandafter{\macrolist\commondummyword#1}%       \xdef\macrolist{\the\toks0}%  } @@ -6608,7 +8101,7 @@ end  % This does \let #1 = #2, with \csnames; that is,  %   \let \csname#1\endcsname = \csname#2\endcsname  % (except of course we have to play expansion games). -%  +%  \def\cslet#1#2{%    \expandafter\let    \csname#1\expandafter\endcsname @@ -6634,46 +8127,60 @@ end  % Macro bodies are absorbed as an argument in a context where  % all characters are catcode 10, 11 or 12, except \ which is active -% (as in normal texinfo). It is necessary to change the definition of \. - +% (as in normal texinfo). It is necessary to change the definition of \ +% to recognize macro arguments; this is the job of \mbodybackslash. +%  % Non-ASCII encodings make 8-bit characters active, so un-activate  % them to avoid their expansion.  Must do this non-globally, to  % confine the change to the current group. - +%  % It's necessary to have hard CRs when the macro is executed. This is -% done by  making ^^M (\endlinechar) catcode 12 when reading the macro +% done by making ^^M (\endlinechar) catcode 12 when reading the macro  % body, and then making it the \newlinechar in \scanmacro. - -\def\scanctxt{% +% +\def\scanctxt{% used as subroutine    \catcode`\"=\other    \catcode`\+=\other    \catcode`\<=\other    \catcode`\>=\other -  \catcode`\@=\other    \catcode`\^=\other    \catcode`\_=\other    \catcode`\|=\other    \catcode`\~=\other -  \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi +  \passthroughcharstrue  } -\def\scanargctxt{% +\def\scanargctxt{% used for copying and captions, not macros.    \scanctxt +  \catcode`\@=\other    \catcode`\\=\other    \catcode`\^^M=\other  } -\def\macrobodyctxt{% +\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 +% changes here are ineffectual if the macro invocation was nested inside +% an argument to another Texinfo command.  \def\macroargctxt{%    \scanctxt -  \catcode`\\=\other +  \catcode`\ =\active +  \catcode`\^^M=\other +  \catcode`\\=\active +} + +\def\macrolineargctxt{% used for whole-line arguments without braces +  \scanctxt +  \catcode`\{=\other +  \catcode`\}=\other  }  % \mbodybackslash is the definition of \ in @macro bodies. @@ -6681,22 +8188,30 @@ end  % where N is the macro parameter number.  % We define \csname macarg.\endcsname to be \realbackslash, so  % \\ in macro replacement text gets you a backslash. - +%  {\catcode`@=0 @catcode`@\=@active   @gdef@usembodybackslash{@let\=@mbodybackslash}   @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}  }  \expandafter\def\csname macarg.\endcsname{\realbackslash} +\def\margbackslash#1{\char`\#1 } +  \def\macro{\recursivefalse\parsearg\macroxxx}  \def\rmacro{\recursivetrue\parsearg\macroxxx}  \def\macroxxx#1{% -  \getargs{#1}%           now \macname is the macname and \argl the arglist +  \getargs{#1}% now \macname is the macname and \argl the arglist    \ifx\argl\empty       % no arguments -     \paramno=0% +     \paramno=0\relax    \else       \expandafter\parsemargdef \argl;% +     \if\paramno>256\relax +       \ifx\eTeXversion\thisisundefined +         \errhelp = \EMsimple +         \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} +       \fi +     \fi    \fi    \if1\csname ismacro.\the\macname\endcsname       \message{Warning: redefining \the\macname}% @@ -6719,7 +8234,7 @@ end      % Remove the macro name from \macrolist:      \begingroup        \expandafter\let\csname#1\endcsname \relax -      \let\definedummyword\unmacrodo +      \let\commondummyword\unmacrodo        \xdef\macrolist{\macrolist}%      \endgroup    \else @@ -6734,129 +8249,464 @@ end    \ifx #1\relax      % remove this    \else -    \noexpand\definedummyword \noexpand#1% +    \noexpand\commondummyword \noexpand#1%    \fi  } -% This makes use of the obscure feature that if the last token of a -% <parameter list> is #, then the preceding argument is delimited by -% an opening brace, and that opening brace is not consumed. +% \getargs -- Parse the arguments to a @macro line.  Set \macname to +% the name of the macro, and \argl to the braced argument list.  \def\getargs#1{\getargsxxx#1{}}  \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} -\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacname#1 #2\relax{\macname={#1}}  \def\getmacargs#1{\def\argl{#1}} +% This made use of the feature that if the last token of a +% <parameter list> is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. -% Parse the optional {params} list.  Set up \paramno and \paramlist -% so \defmacro knows what to do.  Define \macarg.blah for each blah -% in the params list, to be ##N where N is the position in that list. +% Parse the optional {params} list to @macro or @rmacro. +% Set \paramno to the number of arguments, +% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a +% three-param macro.)  Define \macarg.BLAH for each BLAH in the params +% list to some hook where the argument is to be expanded.  If there are +% less than 10 arguments that hook is to be replaced by ##N where N +% is the position in that list, that is to say the macro arguments are to be +% defined `a la TeX in the macro body.   +%  % That gets used by \mbodybackslash (above). - -% We need to get `macro parameter char #' into several definitions. -% The technique used is stolen from LaTeX:  let \hash be something -% unexpandable, insert that wherever you need a #, and then redefine -% it to # just before using the token list produced.  % -% The same technique is used to protect \eatspaces till just before -% the macro is used. - -\def\parsemargdef#1;{\paramno=0\def\paramlist{}% -        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +% If there are 10 or more arguments, a different technique is used: see +% \parsemmanyargdef. +% +\def\parsemargdef#1;{% +  \paramno=0\def\paramlist{}% +  \let\hash\relax +  % \hash is redefined to `#' later to get it into definitions +  \let\xeatspaces\relax +  \parsemargdefxxx#1,;,% +  \ifnum\paramno<10\relax\else +    \paramno0\relax +    \parsemmanyargdef@@#1,;,% 10 or more arguments +  \fi +}  \def\parsemargdefxxx#1,{%    \if#1;\let\next=\relax    \else \let\next=\parsemargdefxxx -    \advance\paramno by 1% +    \advance\paramno by 1      \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname          {\xeatspaces{\hash\the\paramno}}%      \edef\paramlist{\paramlist\hash\the\paramno,}%    \fi\next} -% These two commands read recursive and nonrecursive macro bodies. -% (They're different since rec and nonrec macros end differently.) +% \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 backslashshes in the macro  +% body to be transformed. +% Set \macrobody to the body of the macro, and call \defmacro. +% +{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% +{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% +\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}% + +% Make @ a letter, so that we can make private-to-Texinfo macro names. +\edef\texiatcatcode{\the\catcode`\@} +\catcode `@=11\relax + +%%%%%%%%%%%%%% Code for > 10 arguments only   %%%%%%%%%%%%%%%%%% + +% If there are 10 or more arguments, a different technique is used, where the +% hook remains in the body, and when macro is to be expanded the body is +% processed again to replace the arguments. +% +% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the +% argument N value and then \edef the body (nothing else will expand because of +% the catcode regime under which the body was input). +% +% If you compile with TeX (not eTeX), and you have macros with 10 or more +% arguments, no macro can have more than 256 arguments (else error). +% +% In case that there are 10 or more arguments we parse again the arguments +% list to set new definitions for the \macarg.BLAH macros corresponding to +% each BLAH argument. It was anyhow needed to parse already once this list +% in order to count the arguments, and as macros with at most 9 arguments +% are by far more frequent than macro with 10 or more arguments, defining +% twice the \macarg.BLAH macros does not cost too much processing power. +\def\parsemmanyargdef@@#1,{% +  \if#1;\let\next=\relax +  \else  +    \let\next=\parsemmanyargdef@@ +    \edef\tempb{\eatspaces{#1}}% +    \expandafter\def\expandafter\tempa +       \expandafter{\csname macarg.\tempb\endcsname}% +    % Note that we need some extra \noexpand\noexpand, this is because we +    % don't want \the  to be expanded in the \parsermacbody  as it uses an +    % \xdef . +    \expandafter\edef\tempa +      {\noexpand\noexpand\noexpand\the\toks\the\paramno}% +    \advance\paramno by 1\relax +  \fi\next} + -\long\def\parsemacbody#1@end macro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% -\long\def\parsermacbody#1@end rmacro% -{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\let\endargs@\relax +\let\nil@\relax +\def\nilm@{\nil@}% +\long\def\nillm@{\nil@}% -% This defines the macro itself. There are six cases: recursive and -% nonrecursive macros of zero, one, and many arguments. -% Much magic with \expandafter here. +% This macro is expanded during the Texinfo macro expansion, not during its +% definition.  It gets all the arguments' values and assigns them to macros +% macarg.ARGNAME +% +% #1 is the macro name +% #2 is the list of argument names +% #3 is the list of argument values +\def\getargvals@#1#2#3{% +  \def\macargdeflist@{}% +  \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. +  \def\paramlist{#2,\nil@}% +  \def\macroname{#1}% +  \begingroup +  \macroargctxt +  \def\argvaluelist{#3,\nil@}% +  \def\@tempa{#3}% +  \ifx\@tempa\empty +    \setemptyargvalues@ +  \else +    \getargvals@@ +  \fi +} +\def\getargvals@@{% +  \ifx\paramlist\nilm@ +      % Some sanity check needed here that \argvaluelist is also empty. +      \ifx\argvaluelist\nillm@ +      \else +        \errhelp = \EMsimple +        \errmessage{Too many arguments in macro `\macroname'!}% +      \fi +      \let\next\macargexpandinbody@ +  \else +    \ifx\argvaluelist\nillm@ +       % No more arguments values passed to macro.  Set remaining named-arg +       % macros to empty. +       \let\next\setemptyargvalues@ +    \else +      % pop current arg name into \@tempb +      \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% +      \expandafter\@tempa\expandafter{\paramlist}% +       % pop current argument value into \@tempc +      \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% +      \expandafter\@tempa\expandafter{\argvaluelist}% +       % Here \@tempb is the current arg name and \@tempc is the current arg value. +       % First place the new argument macro definition into \@tempd +       \expandafter\macname\expandafter{\@tempc}% +       \expandafter\let\csname macarg.\@tempb\endcsname\relax +       \expandafter\def\expandafter\@tempe\expandafter{% +         \csname macarg.\@tempb\endcsname}% +       \edef\@tempd{\long\def\@tempe{\the\macname}}% +       \push@\@tempd\macargdeflist@ +       \let\next\getargvals@@ +    \fi +  \fi +  \next +} + +\def\push@#1#2{% +  \expandafter\expandafter\expandafter\def +  \expandafter\expandafter\expandafter#2% +  \expandafter\expandafter\expandafter{% +  \expandafter#1#2}% +} + +% Replace arguments by their values in the macro body, and place the result +% in macro \@tempa. +%  +\def\macvalstoargs@{% +  %  To do this we use the property that token registers that are \the'ed +  % within an \edef  expand only once. So we are going to place all argument +  % values into respective token registers. +  % +  % First we save the token context, and initialize argument numbering. +  \begingroup +    \paramno0\relax +    % Then, for each argument number #N, we place the corresponding argument +    % value into a new token list register \toks#N +    \expandafter\putargsintokens@\saveparamlist@,;,% +    % Then, we expand the body so that argument are replaced by their +    % values. The trick for values not to be expanded themselves is that they +    % are within tokens and that tokens expand only once in an \edef . +    \edef\@tempc{\csname mac.\macroname .body\endcsname}% +    % Now we restore the token stack pointer to free the token list registers +    % which we have used, but we make sure that expanded body is saved after +    % group. +    \expandafter +  \endgroup +  \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% +  } + +% Define the named-macro outside of this group and then close this group.  +%  +\def\macargexpandinbody@{%  +  \expandafter +  \endgroup +  \macargdeflist@ +  % First the replace in body the macro arguments by their values, the result +  % is in \@tempa . +  \macvalstoargs@ +  % Then we point at the \norecurse or \gobble (for recursive) macro value +  % with \@tempb . +  \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname +  % Depending on whether it is recursive or not, we need some tailing +  % \egroup . +  \ifx\@tempb\gobble +     \let\@tempc\relax +  \else +     \let\@tempc\egroup +  \fi +  % And now we do the real job: +  \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% +  \@tempd +} + +\def\putargsintokens@#1,{% +  \if#1;\let\next\relax +  \else +    \let\next\putargsintokens@ +    % First we allocate the new token list register, and give it a temporary +    % alias \@tempb . +    \toksdef\@tempb\the\paramno +    % Then we place the argument value into that token list register. +    \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname +    \expandafter\@tempb\expandafter{\@tempa}% +    \advance\paramno by 1\relax +  \fi +  \next +} + +% Trailing missing arguments are set to empty. +%  +\def\setemptyargvalues@{% +  \ifx\paramlist\nilm@ +    \let\next\macargexpandinbody@ +  \else +    \expandafter\setemptyargvaluesparser@\paramlist\endargs@ +    \let\next\setemptyargvalues@ +  \fi +  \next +} + +\def\setemptyargvaluesparser@#1,#2\endargs@{% +  \expandafter\def\expandafter\@tempa\expandafter{% +    \expandafter\def\csname macarg.#1\endcsname{}}% +  \push@\@tempa\macargdeflist@ +  \def\paramlist{#2}% +} + +% #1 is the element target macro +% #2 is the list macro +% #3,#4\endargs@ is the list value +\def\pop@#1#2#3,#4\endargs@{% +   \def#1{#3}% +   \def#2{#4}% +} +\long\def\longpop@#1#2#3,#4\endargs@{% +   \long\def#1{#3}% +   \long\def#2{#4}% +} + + +%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% + + +% This defines a Texinfo @macro or @rmacro, called by \parsemacbody. +%    \macrobody has the body of the macro in it, with placeholders for +% its parameters, looking like "\xeatspaces{\hash 1}". +%    \paramno is the number of parameters +%    \paramlist is a TeX parameter text, e.g. "#1,#2,#3," +% There are four cases: macros of zero, one, up to nine, and many arguments.  % \xdef is used so that macro definitions will survive the file -% they're defined in; @include reads the file inside a group. +% they're defined in: @include reads the file inside a group. +%  \def\defmacro{%    \let\hash=##% convert placeholders to macro parameter chars -  \ifrecursive -    \ifcase\paramno -    % 0 -      \expandafter\xdef\csname\the\macname\endcsname{% -        \noexpand\scanmacro{\temp}}% -    \or % 1 -      \expandafter\xdef\csname\the\macname\endcsname{% -         \bgroup\noexpand\macroargctxt -         \noexpand\braceorline -         \expandafter\noexpand\csname\the\macname xxx\endcsname}% -      \expandafter\xdef\csname\the\macname xxx\endcsname##1{% -         \egroup\noexpand\scanmacro{\temp}}% -    \else % many -      \expandafter\xdef\csname\the\macname\endcsname{% -         \bgroup\noexpand\macroargctxt -         \noexpand\csname\the\macname xx\endcsname}% -      \expandafter\xdef\csname\the\macname xx\endcsname##1{% -          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% -      \expandafter\expandafter -      \expandafter\xdef -      \expandafter\expandafter -        \csname\the\macname xxx\endcsname -          \paramlist{\egroup\noexpand\scanmacro{\temp}}% -    \fi +  \ifnum\paramno=1 +    \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 -    \ifcase\paramno -    % 0 -      \expandafter\xdef\csname\the\macname\endcsname{% -        \noexpand\norecurse{\the\macname}% -        \noexpand\scanmacro{\temp}\egroup}% -    \or % 1 -      \expandafter\xdef\csname\the\macname\endcsname{% -         \bgroup\noexpand\macroargctxt -         \noexpand\braceorline -         \expandafter\noexpand\csname\the\macname xxx\endcsname}% -      \expandafter\xdef\csname\the\macname xxx\endcsname##1{% -        \egroup -        \noexpand\norecurse{\the\macname}% -        \noexpand\scanmacro{\temp}\egroup}% -    \else % many +    \let\xeatspaces\relax % suppress expansion +  \fi +  \ifcase\paramno +  % 0 +    \expandafter\xdef\csname\the\macname\endcsname{% +      \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{% +      \egroup +      \noexpand\scanmacro{\macrobody}}% +  \or % 1 +    \expandafter\xdef\csname\the\macname\endcsname{% +       \bgroup +       \noexpand\braceorline +       \expandafter\noexpand\csname\the\macname @@@\endcsname}% +    \expandafter\xdef\csname\the\macname @@@\endcsname##1{% +      \egroup +      \noexpand\scanmacro{\macrobody}% +      }% +  \else % at most 9 +    \ifnum\paramno<10\relax +      % @MACNAME sets the context for reading the macro argument +      % @MACNAME@@ gets the argument, processes backslashes and appends a  +      % comma. +      % @MACNAME@@@ removes braces surrounding the argument list. +      % @MACNAME@@@@ scans the macro body with arguments substituted.        \expandafter\xdef\csname\the\macname\endcsname{% -         \bgroup\noexpand\macroargctxt -         \expandafter\noexpand\csname\the\macname xx\endcsname}% -      \expandafter\xdef\csname\the\macname xx\endcsname##1{% -          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% +        \bgroup +        \noexpand\expandafter  % This \expandafter skip any spaces after the +        \noexpand\macroargctxt % macro before we change the catcode of space. +        \noexpand\expandafter +        \expandafter\noexpand\csname\the\macname @@\endcsname}% +      \expandafter\xdef\csname\the\macname @@\endcsname##1{% +          \noexpand\passargtomacro +          \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% +      \expandafter\xdef\csname\the\macname @@@\endcsname##1{% +          \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%        \expandafter\expandafter        \expandafter\xdef        \expandafter\expandafter -      \csname\the\macname xxx\endcsname -      \paramlist{% -          \egroup -          \noexpand\norecurse{\the\macname}% -          \noexpand\scanmacro{\temp}\egroup}% +        \csname\the\macname @@@@\endcsname\paramlist{% +          \egroup\noexpand\scanmacro{\macrobody}}% +    \else % 10 or more: +      \expandafter\xdef\csname\the\macname\endcsname{% +        \noexpand\getargvals@{\the\macname}{\argl}% +      }% +      \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody +      \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble      \fi    \fi} +\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes +  \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} -% \braceorline decides whether the next nonwhitespace character is a -% {.  If so it reads up to the closing }, if not, it reads the whole -% line.  Whatever was read is then fed to the next control sequence -% as an argument (by \parsebrace or \parsearg) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +{\catcode`\@=0 \catcode`\\=13  % We need to manipulate \ so use @ as escape +@catcode`@_=11  % private names +@catcode`@!=11  % used as argument separator + +% \passargtomacro#1#2 - +% Call #1 with a list of tokens #2, with any doubled backslashes in #2 +% compressed to one. +% +% This implementation works by expansion, and not execution (so we cannot use  +% \def or similar).  This reduces the risk of this failing in contexts where  +% complete expansion is done with no execution (for example, in writing out to  +% an auxiliary file for an index entry). +%  +% State is kept in the input stream: the argument passed to +% @look_ahead, @gobble_and_check_finish and @add_segment is +% +% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input) +% +% where: +% THE_MACRO - name of the macro we want to call +% ARG_RESULT - argument list we build to pass to that macro +% PENDING_BS - either a backslash or nothing +% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next + +@gdef@passargtomacro#1#2{% +  @add_segment #1!{}@relax#2\@_finish\% +} +@gdef@_finish{@_finishx} @global@let@_finishx@relax + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 used to look ahead +% +% If the next token is not a backslash, process the rest of the argument;  +% otherwise, remove the next token. +@gdef@look_ahead#1!#2#3#4{% +  @ifx#4\% +   @expandafter@gobble_and_check_finish  +  @else +   @expandafter@add_segment +  @fi#1!{#2}#4#4% +} + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 should be a backslash, which is gobbled. +% #5 looks ahead +% +% Double backslash found.  Add a single backslash, and look ahead. +@gdef@gobble_and_check_finish#1!#2#3#4#5{% +  @add_segment#1\!{}#5#5% +} + +@gdef@is_fi{@fi} + +% #1 - THE_MACRO ARG_RESULT +% #2 - PENDING_BS +% #3 - NEXT_TOKEN +% #4 is input stream until next backslash +% +% Input stream is either at the start of the argument, or just after a  +% backslash sequence, either a lone backslash, or a doubled backslash.   +% NEXT_TOKEN contains the first token in the input stream: if it is \finish,  +% finish; otherwise, append to ARG_RESULT the segment of the argument up until +% the next backslash.  PENDING_BACKSLASH contains a backslash to represent +% a backslash just before the start of the input stream that has not been +% added to ARG_RESULT. +@gdef@add_segment#1!#2#3#4\{% +@ifx#3@_finish +  @call_the_macro#1!% +@else +  % append the pending backslash to the result, followed by the next segment +  @expandafter@is_fi@look_ahead#1#2#4!{\}@fi +  % this @fi is discarded by @look_ahead. +  % we can't get rid of it with \expandafter because we don't know how  +  % long #4 is. +} + +% #1 - THE_MACRO +% #2 - ARG_RESULT +% #3 discards the res of the conditional in @add_segment, and @is_fi ends the  +% conditional. +@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} + +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% \braceorline MAC is used for a one-argument macro MAC.  It checks +% whether the next non-whitespace character is a {.  It sets the context +% for reading the argument (slightly different in the two cases).  Then, +% to read the argument, in the whole-line case, it then calls the regular +% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. +%   \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}  \def\braceorlinexxx{% -  \ifx\nchar\bgroup\else -    \expandafter\parsearg +  \ifx\nchar\bgroup +    \macroargctxt +    \expandafter\passargtomacro +  \else +    \macrolineargctxt\expandafter\parsearg    \fi \macnamexxx}  % @alias.  % We need some trickery to remove the optional spaces around the equal -% sign.  Just make them active and then expand them all to nothing. +% sign.  Make them active and then expand them all to nothing. +%  \def\alias{\parseargusing\obeyspaces\aliasxxx}  \def\aliasxxx #1{\aliasyyy#1\relax}  \def\aliasyyy #1=#2\relax{% @@ -6877,7 +8727,8 @@ end  % @inforef is relatively simple.  \def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, +\def\inforefzzz #1,#2,#3,#4**{% +  \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},    node \samp{\ignorespaces#1{}}}  % @node's only job in TeX is to define \lastnode, which is used in @@ -6930,7 +8781,10 @@ end    \pdfmkdest{#1}%    \iflinks      {% +      \requireauxfile        \atdummies  % preserve commands, but don't expand them +      % match definition in \xrdef, \refx, \xrefX. +      \def\value##1{##1}%        \edef\writexrdef##1##2{%  	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef  	  ##1}{##2}}% these are parameters of \writexrdef @@ -6938,39 +8792,78 @@ end        \toks0 = \expandafter{\lastsection}%        \immediate \writexrdef{title}{\the\toks0 }%        \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. -      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout +      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout      }%    \fi  } +% @xrefautosectiontitle on|off says whether @section(ing) names are used +% automatically in xrefs, if the third arg is not explicitly specified. +% This was provided as a "secret" @set xref-automatic-section-title +% variable, now it's official. +%  +\parseargdef\xrefautomaticsectiontitle{% +  \def\temp{#1}% +  \ifx\temp\onword +    \expandafter\let\csname SETxref-automatic-section-title\endcsname +      = \empty +  \else\ifx\temp\offword +    \expandafter\let\csname SETxref-automatic-section-title\endcsname +      = \relax +  \else +    \errhelp = \EMsimple +    \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', +                must be on|off}% +  \fi\fi +} + +%   % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is  % the node name, #2 the name of the Info cross-reference, #3 the printed  % node name, #4 the name of the Info file, #5 the name of the printed  % manual.  All but the node name can be omitted.  % -\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} -\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} +\def\pxref{\putwordsee{} \xrefXX} +\def\xref{\putwordSee{} \xrefXX} +\def\ref{\xrefXX} + +\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} +\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} +% +\newbox\toprefbox +\newbox\printedrefnamebox +\newbox\infofilenamebox +\newbox\printedmanualbox +%  \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup    \unsepspaces -  \def\printedmanual{\ignorespaces #5}% +  % +  % Get args without leading/trailing spaces.    \def\printedrefname{\ignorespaces #3}% -  \setbox1=\hbox{\printedmanual\unskip}% -  \setbox0=\hbox{\printedrefname\unskip}% -  \ifdim \wd0 = 0pt +  \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% +  % +  \def\infofilename{\ignorespaces #4}% +  \setbox\infofilenamebox = \hbox{\infofilename\unskip}% +  % +  \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 -      % Use the node name inside the square brackets. +    \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 -      % Use the actual chapter/section title appear inside -      % the square brackets.  Use the real section title if we have it. -      \ifdim \wd1 > 0pt -        % It is in another manual, so we don't have it. +      % 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 know the real title if we have the xref values. +          % 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. @@ -6982,64 +8875,124 @@ end    %    % 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. +     % etc. don't get their TeX definitions.  This ignores all spaces in +     % #4, including (wrongly) those in the middle of the filename.       \getfilename{#4}%       % -     % See comments at \activebackslashdouble. -     {\activebackslashdouble \xdef\pdfxrefdest{#1}% -      \backslashparens\pdfxrefdest}% +     % 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{\pdfxrefdest}% +       goto file{\the\filename.pdf} name{\pdfdestname}%       \else -       goto name{\pdfmkpgn{\pdfxrefdest}}% +       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 -  % -  % Float references are printed completely differently: "Figure 1.2" -  % instead of "[somenode], p.3".  We distinguish them by the -  % LABEL-title being set to a magic string.    {%      % Have to otherify everything special to allow the \csname to      % include an _ in the xref name, etc.      \indexnofonts      \turnoffactive +    \def\value##1{##1}%      \expandafter\global\expandafter\let\expandafter\Xthisreftitle        \csname XR#1-title\endcsname    }% +  % +  % Float references are printed completely differently: "Figure 1.2" +  % instead of "[somenode], p.3".  \iffloat distinguishes them by +  % \Xthisreftitle being set to a magic string.    \iffloat\Xthisreftitle      % If the user specified the print name (third arg) to the ref,      % print it instead of our usual "Figure 1.2". -    \ifdim\wd0 = 0pt +    \ifdim\wd\printedrefnamebox = 0pt        \refx{#1-snt}{}%      \else        \printedrefname      \fi      % -    % if the user also gave the printed manual name (fifth arg), append +    % If the user also gave the printed manual name (fifth arg), append      % "in MANUALNAME". -    \ifdim \wd1 > 0pt +    \ifdim \wd\printedmanualbox > 0pt        \space \putwordin{} \cite{\printedmanual}%      \fi    \else      % node/anchor (non-float) references. +    %  +    % If we use \unhbox to print the node names, TeX does not insert +    % empty discretionaries after hyphens, which means that it will not +    % find a line break at a hyphen in a node names.  Since some manuals +    % are best written with fairly long node names, containing hyphens, +    % this is a loss.  Therefore, we give the text of the node name +    % again, so it is as if TeX is seeing it for the first time. +    %  +    \ifdim \wd\printedmanualbox > 0pt +      % Cross-manual reference with a printed manual name. +      %  +      \crossmanualxref{\cite{\printedmanual\unskip}}% +    % +    \else\ifdim \wd\infofilenamebox > 0pt +      % Cross-manual reference with only an info filename (arg 4), no +      % printed manual name (arg 5).  This is essentially the same as +      % the case above; we output the filename, since we have nothing else. +      %  +      \crossmanualxref{\code{\infofilename\unskip}}%      % -    % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not -    % insert empty discretionaries after hyphens, which means that it will -    % not find a line break at a hyphen in a node names.  Since some manuals -    % are best written with fairly long node names, containing hyphens, this -    % is a loss.  Therefore, we give the text of the node name again, so it -    % is as if TeX is seeing it for the first time. -    \ifdim \wd1 > 0pt -      \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%      \else +      % Reference within this manual. +      %        % _ (for example) has to be the character _ for the purposes of the        % control sequence corresponding to the node, but it has to expand        % into the usual \leavevmode...\vrule stuff for purposes of @@ -7051,7 +9004,7 @@ end         \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%         \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi        }% -      % output the `[mynode]' via a macro so it can be overridden. +      % output the `[mynode]' via the macro below so it can be overridden.        \xrefprintnodename\printedrefname        %        % But we always want a comma and a space: @@ -7059,11 +9012,46 @@ end        %        % output the `page 3'.        \turnoffactive \putwordpage\tie\refx{#1-pg}{}% -    \fi +      % 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} +% Output a cross-manual xref to #1.  Used just above (twice). +%  +% Only include the text "Section ``foo'' in" if the foo is neither +% missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply +% "see The Foo Manual", the idea being to refer to the whole manual. +%  +% But, this being TeX, we can't easily compare our node name against the +% string "Top" while ignoring the possible spaces before and after in +% the input.  By adding the arbitrary 7sp below, we make it much less +% likely that a real node name would have the same width as "Top" (e.g., +% in a monospaced font).  Hopefully it will never happen in practice. +%  +% For the same basic reason, we retypeset the "Top" at every +% reference, since the current font is indeterminate. +%  +\def\crossmanualxref#1{% +  \setbox\toprefbox = \hbox{Top\kern7sp}% +  \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% +  \ifdim \wd2 > 7sp  % nonempty? +    \ifdim \wd2 = \wd\toprefbox \else  % same as Top? +      \putwordSection{} ``\printedrefname'' \putwordin{}\space +    \fi +  \fi +  #1% +} +  % This macro is called from \xrefX for the `[nodename]' part of xref  % output.  It's a separate macro only so it can be changed more easily,  % since square brackets don't work well in some documents.  Particularly @@ -7099,13 +9087,14 @@ end    \fi\fi\fi  } -% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. -% If its value is nonempty, SUFFIX is output afterward. -% +% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX  +% is output afterwards if non-empty.  \def\refx#1#2{% +  \requireauxfile    {%      \indexnofonts      \otherbackslash +    \def\value##1{##1}%      \expandafter\global\expandafter\let\expandafter\thisrefX        \csname XR#1\endcsname    }% @@ -7114,7 +9103,8 @@ end      \angleleft un\-de\-fined\angleright      \iflinks        \ifhavexrefs -        \message{\linenumber Undefined cross reference `#1'.}% +        {\toks0 = {#1}% avoid expansion of possibly-complex value +         \message{\linenumber Undefined cross reference `\the\toks0'.}}%        \else          \ifwarnedxrefs\else            \global\warnedxrefstrue @@ -7129,20 +9119,28 @@ end    #2% Output the suffix in any case.  } -% This is the macro invoked by entries in the aux file.  Usually it's -% just a \def (we prepend XR to the control sequence name to avoid -% collisions).  But if this is a float type, we have more work to do. +% This is the macro invoked by entries in the aux file.  Define a control  +% sequence for a cross-reference target (we prepend XR to the control sequence  +% name to avoid collisions).  The value is the page number.  If this is a float  +% type, we have more work to do.  %  \def\xrdef#1#2{% -  {% The node name might contain 8-bit characters, which in our current -   % implementation are changed to commands like @'e.  Don't let these -   % mess up the control sequence name. +  {% Expand the node or anchor name to remove control sequences. +   % \turnoffactive stops 8-bit characters being changed to commands +   % like @'e.  \refx does the same to retrieve the value in the definition.      \indexnofonts      \turnoffactive +    \def\value##1{##1}%      \xdef\safexrefname{#1}%    }%    % -  \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref +  \bgroup +    \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% +  \egroup +  % We put the \gdef inside a group to avoid the definitions building up on  +  % TeX's save stack, which can cause it to run out of space for aux files with  +  % thousands of lines.  \gdef doesn't use the save stack, but \csname does +  % when it defines an unknown control sequence as \relax.     %    % Was that xref control sequence that we just defined for a float?    \expandafter\iffloat\csname XR\safexrefname\endcsname @@ -7165,6 +9163,23 @@ end    \fi  } +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate at the beginning of the file. +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% Used when writing to the aux file, or when using data from it. +\def\requireauxfile{% +  \iflinks +    \tryauxfile +    % Open the new aux file.  TeX will close it automatically at exit. +    \immediate\openout\auxfile=\jobname.aux +  \fi +  \global\let\requireauxfile=\relax   % Only do this once. +} +  % Read the last existing aux file, if any.  No error if none exists.  %  \def\tryauxfile{% @@ -7243,16 +9258,6 @@ end    % now.  --karl, 15jan04.    \catcode`\\=\other    % -  % Make the characters 128-255 be printing characters. -  {% -    \count1=128 -    \def\loop{% -      \catcode\count1=\other -      \advance\count1 by 1 -      \ifnum \count1<256 \loop \fi -    }% -  }% -  %    % @ is our escape character in .aux files, and we need braces.    \catcode`\{=1    \catcode`\}=2 @@ -7278,15 +9283,13 @@ end  % space to prevent strange expansion errors.)  \def\supereject{\par\penalty -20000\footnoteno =0 } -% @footnotestyle is meaningful for info output only. +% @footnotestyle is meaningful for Info output only.  \let\footnotestyle=\comment  {\catcode `\@=11  %  % Auto-number footnotes.  Otherwise like plain.  \gdef\footnote{% -  \let\indent=\ptexindent -  \let\noindent=\ptexnoindent    \global\advance\footnoteno by \@ne    \edef\thisfootno{$^{\the\footnoteno}$}%    % @@ -7310,10 +9313,15 @@ end  %  \gdef\dofootnote{%    \insert\footins\bgroup +  % +  % Nested footnotes are not supported in TeX, that would take a lot +  % more work.  (\startsavinginserts does not suffice.) +  \let\footnote=\errfootnotenest +  %    % We want to typeset this text as a normal paragraph, even if the    % footnote reference occurs in (for example) a display environment.    % So reset some parameters. -  \hsize=\pagewidth +  \hsize=\txipagewidth    \interlinepenalty\interfootnotelinepenalty    \splittopskip\ht\strutbox % top baseline for broken footnotes    \splitmaxdepth\dp\strutbox @@ -7341,17 +9349,30 @@ end    % expands into a box, it must come within the paragraph, lest it    % provide a place where TeX can split the footnote.    \footstrut +  % +  % Invoke rest of plain TeX footnote routine.    \futurelet\next\fo@t  }  }%end \catcode `\@=11 +\def\errfootnotenest{% +  \errhelp=\EMsimple +  \errmessage{Nested footnotes not supported in texinfo.tex, +    even though they work in makeinfo; sorry} +} + +\def\errfootnoteheading{% +  \errhelp=\EMsimple +  \errmessage{Footnotes in chapters, sections, etc., are not supported} +} +  % In case a @footnote appears in a vbox, save the footnote text and create  % the real \insert just after the vbox finished.  Otherwise, the insertion  % would be lost.  % Similarly, if a @footnote appears inside an alignment, save the footnote  % text to a box and make the \insert when a row of the table is finished.  % And the same can be done for other insert classes.  --kasal, 16nov03. - +%  % Replace the \insert primitive by a cheating macro.  % Deeper inside, just make sure that the saved insertions are not spilled  % out prematurely. @@ -7428,7 +9449,7 @@ end    it from ftp://tug.org/tex/epsf.tex.}  %  \def\image#1{% -  \ifx\epsfbox\undefined +  \ifx\epsfbox\thisisundefined      \ifwarnednoepsf \else        \errhelp = \noepsfhelp        \errmessage{epsf.tex not found, images will be ignored}% @@ -7444,14 +9465,22 @@ end  % #2 is (optional) width, #3 is (optional) height.  % #4 is (ignored optional) html alt text.  % #5 is (ignored optional) extension. -% #6 is just the usual extra ignored arg for parsing this stuff. +% #6 is just the usual extra ignored arg for parsing stuff.  \newif\ifimagevmode  \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 +  \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro    % If the image is by itself, center it.    \ifvmode      \imagevmodetrue +  \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 @@ -7461,21 +9490,37 @@ end    \fi    %    % Leave vertical mode so that indentation from an enclosing -  % environment such as @quotation is respected.  On the other hand, if -  % it's at the top level, we don't want the normal paragraph indentation. -  \noindent +  %  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 +    % For pdfTeX and LuaTeX <= 0.80      \dopdfimage{#1}{#2}{#3}%    \else -    % \epsfbox itself resets \epsf?size at each figure. -    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi -    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi -    \epsfbox{#1.eps}% +    \ifx\XeTeXrevision\thisisundefined +      % For epsf.tex +      % \epsfbox itself resets \epsf?size at each figure. +      \setbox0 = \hbox{\ignorespaces #2}% +        \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi +      \setbox0 = \hbox{\ignorespaces #3}% +        \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi +      \epsfbox{#1.eps}% +    \else +      % For XeTeX +      \doxeteximage{#1}{#2}{#3}% +    \fi    \fi    % -  \ifimagevmode \medskip \fi  % space after the standalone image +  \ifimagevmode +    \medskip  % space after a standalone image +  \fi   +  \ifx\centersub\centerV \egroup \fi  \endgroup} @@ -7591,7 +9636,7 @@ end      %      \ifx\thiscaption\empty \else        \ifx\floatident\empty \else -	\appendtomacro\captionline{: }% had ident, so need a colon between +        \appendtomacro\captionline{: }% had ident, so need a colon between        \fi        %        % caption text. @@ -7615,32 +9660,20 @@ end        % \floatlabel-lof.  Besides \floatident, we include the short        % caption if specified, else the full caption if specified, else nothing.        {% +        \requireauxfile          \atdummies          % -        % since we read the caption text in the macro world, where ^^M -        % is turned into a normal character, we have to scan it back, so -        % we don't write the literal three characters "^^M" into the aux file. -	\scanexp{% -	  \xdef\noexpand\gtemp{% -	    \ifx\thisshortcaption\empty -	      \thiscaption -	    \else -	      \thisshortcaption -	    \fi -	  }% -	}% +        \ifx\thisshortcaption\empty +          \def\gtemp{\thiscaption}% +        \else +          \def\gtemp{\thisshortcaption}% +        \fi          \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident -	  \ifx\gtemp\empty \else : \gtemp \fi}}% +          \ifx\gtemp\empty \else : \gtemp \fi}}%        }%      \fi    \egroup  % end of \vtop    % -  % place the captured inserts -  % -  % BEWARE: when the floats start floating, we have to issue warning -  % whenever an insert appears inside a float which could possibly -  % float. --kasal, 26may04 -  %    \checkinserts  } @@ -7747,47 +9780,139 @@ end  \message{localization,} -% @documentlanguage is usually given very early, just after -% @setfilename.  If done too late, it may not override everything -% properly.  Single argument is the language (de) or locale (de_DE) -% abbreviation.  It would be nice if we could set up a hyphenation file. +% For single-language documents, @documentlanguage is usually given very +% early, just after @documentencoding.  Single argument is the language +% (de) or locale (de_DE) abbreviation.  %  {    \catcode`\_ = \active    \globaldefs=1 -\parseargdef\documentlanguage{\begingroup -  \let_=\normalunderscore  % normal _ character for filenames +\parseargdef\documentlanguage{%    \tex % read txi-??.tex file in plain TeX.      % Read the file by the name they passed if it exists. +    \let_ = \normalunderscore  % normal _ character for filename test      \openin 1 txi-#1.tex      \ifeof 1 -      \documentlanguagetrywithoutunderscore{#1_\finish}% +      \documentlanguagetrywithoutunderscore #1_\finish      \else +      \globaldefs = 1  % everything in the txi-LL files needs to persist        \input txi-#1.tex      \fi      \closein 1 -  \endgroup -\endgroup} +  \endgroup % end raw TeX  }  %  % If they passed de_DE, and txi-de_DE.tex doesn't exist,  % try txi-de.tex. -%  -\def\documentlanguagetrywithoutunderscore#1_#2\finish{% +% +\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%    \openin 1 txi-#1.tex    \ifeof 1      \errhelp = \nolanghelp      \errmessage{Cannot read language file txi-#1.tex}%    \else +    \globaldefs = 1  % everything in the txi-LL files needs to persist      \input txi-#1.tex    \fi    \closein 1  } +}% end of special _ catcode  %  \newhelp\nolanghelp{The given language definition file cannot be found or -is empty.  Maybe you need to install it?  In the current directory -should work if nowhere else does.} +is empty.  Maybe you need to install it?  Putting it in the current +directory should work if nowhere else does.} + +% This macro is called from txi-??.tex files; the first argument is the +% \language name to set (without the "\lang@" prefix), the second and +% third args are \{left,right}hyphenmin. +% +% The language names to pass are determined when the format is built. +% See the etex.log file created at that time, e.g., +% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. +% +% With TeX Live 2008, etex now includes hyphenation patterns for all +% available languages.  This means we can support hyphenation in +% Texinfo, at least to some extent.  (This still doesn't solve the +% accented characters problem.) +% +\catcode`@=11 +\def\txisetlanguage#1#2#3{% +  % do not set the language if the name is undefined in the current TeX. +  \expandafter\ifx\csname lang@#1\endcsname \relax +    \message{no patterns for #1}% +  \else +    \global\language = \csname lang@#1\endcsname +  \fi +  % but there is no harm in adjusting the hyphenmin values regardless. +  \global\lefthyphenmin = #2\relax +  \global\righthyphenmin = #3\relax +} + +% XeTeX and LuaTeX can handle Unicode natively. +% Their default I/O uses UTF-8 sequences instead of a byte-wise operation. +% Other TeX engines' I/O (pdfTeX, etc.) is byte-wise. +% +\newif\iftxinativeunicodecapable +\newif\iftxiusebytewiseio + +\ifx\XeTeXrevision\thisisundefined +  \ifx\luatexversion\thisisundefined +    \txinativeunicodecapablefalse +    \txiusebytewiseiotrue +  \else +    \txinativeunicodecapabletrue +    \txiusebytewiseiofalse +  \fi +\else +  \txinativeunicodecapabletrue +  \txiusebytewiseiofalse +\fi + +% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex +% for non-UTF-8 (byte-wise) encodings. +% +\def\setbytewiseio{% +  \ifx\XeTeXrevision\thisisundefined +  \else +    \XeTeXdefaultencoding "bytes"  % For subsequent files to be read +    \XeTeXinputencoding "bytes"  % For document root file +    % Unfortunately, there seems to be no corresponding XeTeX command for +    % output encoding.  This is a problem for auxiliary index and TOC files. +    % The only solution would be perhaps to write out @U{...} sequences in +    % place of non-ASCII characters. +  \fi + +  \ifx\luatexversion\thisisundefined +  \else +    \directlua{ +    local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub +    local function convert_char (char) +      return utf8_char(byte(char)) +    end + +    local function convert_line (line) +      return gsub(line, ".", convert_char) +    end + +    callback.register("process_input_buffer", convert_line) + +    local function convert_line_out (line) +      local line_out = "" +      for c in string.utfvalues(line) do +         line_out = line_out .. string.char(c) +      end +      return line_out +    end + +    callback.register("process_output_buffer", convert_line_out) +    } +  \fi + +  \txiusebytewiseiotrue +} + +% Helpers for encodings.  % Set the catcode of characters 128 through 255 to the specified number.  %  \def\setnonasciicharscatcode#1{% @@ -7809,7 +9934,9 @@ should work if nowhere else does.}  % @documentencoding sets the definition of non-ASCII characters  % according to the specified encoding.  % -\parseargdef\documentencoding{% +\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} +\def\documentencodingzzz#1{% +  %    % Encoding being declared for the document.    \def\declaredencoding{\csname #1.enc\endcsname}%    % @@ -7825,35 +9952,66 @@ should work if nowhere else does.}       \asciichardefs    %    \else \ifx \declaredencoding \lattwo +     \iftxinativeunicodecapable +       \setbytewiseio +     \fi       \setnonasciicharscatcode\active       \lattwochardefs    % -  \else \ifx \declaredencoding \latone  +  \else \ifx \declaredencoding \latone +     \iftxinativeunicodecapable +       \setbytewiseio +     \fi       \setnonasciicharscatcode\active       \latonechardefs    %    \else \ifx \declaredencoding \latnine +     \iftxinativeunicodecapable +       \setbytewiseio +     \fi       \setnonasciicharscatcode\active       \latninechardefs    %    \else \ifx \declaredencoding \utfeight -     \setnonasciicharscatcode\active -     \utfeightchardefs +     \iftxinativeunicodecapable +       % For native Unicode handling (XeTeX and LuaTeX) +       \nativeunicodechardefs +     \else +       % 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  -    \message{Unknown document encoding #1, ignoring.}% +  \else +    \message{Ignoring unknown document encoding: #1.}%    %    \fi % utfeight    \fi % latnine    \fi % latone    \fi % lattwo    \fi % ascii +  % +  \ifx\XeTeXrevision\thisisundefined +  \else +    \ifx \declaredencoding \utfeight +    \else +      \ifx \declaredencoding \ascii +      \else +        \message{Warning: XeTeX with non-UTF-8 encodings cannot handle % +        non-ASCII characters in auxiliary files.}% +      \fi +    \fi +  \fi  } +% emacs-page  % A message to be logged when using a character that isn't available  % the default font encoding (OT1). -%  -\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} +% +\def\missingcharmsg#1{\message{Character missing, sorry: #1.}}  % Take account of \c (plain) vs. \, (Texinfo) difference.  \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} @@ -7863,111 +10021,119 @@ should work if nowhere else does.}  % macros containing the character definitions.  \setnonasciicharscatcode\active  % + +\def\gdefchar#1#2{% +\gdef#1{% +   \ifpassthroughchars +     \string#1% +   \else +     #2% +   \fi +}} +  % Latin1 (ISO-8859-1) character definitions.  \def\latonechardefs{% -  \gdef^^a0{~}  -  \gdef^^a1{\exclamdown} -  \gdef^^a2{\missingcharmsg{CENT SIGN}}  -  \gdef^^a3{{\pounds}} -  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} -  \gdef^^a5{\missingcharmsg{YEN SIGN}} -  \gdef^^a6{\missingcharmsg{BROKEN BAR}}  -  \gdef^^a7{\S} -  \gdef^^a8{\"{}}  -  \gdef^^a9{\copyright}  -  \gdef^^aa{\ordf} -  \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}}  -  \gdef^^ac{$\lnot$} -  \gdef^^ad{\-}  -  \gdef^^ae{\registeredsymbol}  -  \gdef^^af{\={}} -  % -  \gdef^^b0{\textdegree} -  \gdef^^b1{$\pm$} -  \gdef^^b2{$^2$} -  \gdef^^b3{$^3$} -  \gdef^^b4{\'{}} -  \gdef^^b5{$\mu$} -  \gdef^^b6{\P} -  % -  \gdef^^b7{$^.$} -  \gdef^^b8{\cedilla\ } -  \gdef^^b9{$^1$} -  \gdef^^ba{\ordm} -  % -  \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}} -  \gdef^^bc{$1\over4$} -  \gdef^^bd{$1\over2$} -  \gdef^^be{$3\over4$} -  \gdef^^bf{\questiondown} -  % -  \gdef^^c0{\`A} -  \gdef^^c1{\'A} -  \gdef^^c2{\^A} -  \gdef^^c3{\~A} -  \gdef^^c4{\"A} -  \gdef^^c5{\ringaccent A}  -  \gdef^^c6{\AE} -  \gdef^^c7{\cedilla C} -  \gdef^^c8{\`E} -  \gdef^^c9{\'E} -  \gdef^^ca{\^E} -  \gdef^^cb{\"E} -  \gdef^^cc{\`I} -  \gdef^^cd{\'I} -  \gdef^^ce{\^I} -  \gdef^^cf{\"I} -  % -  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}} -  \gdef^^d1{\~N} -  \gdef^^d2{\`O} -  \gdef^^d3{\'O} -  \gdef^^d4{\^O} -  \gdef^^d5{\~O} -  \gdef^^d6{\"O} -  \gdef^^d7{$\times$} -  \gdef^^d8{\O} -  \gdef^^d9{\`U} -  \gdef^^da{\'U} -  \gdef^^db{\^U} -  \gdef^^dc{\"U} -  \gdef^^dd{\'Y} -  \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}} -  \gdef^^df{\ss} -  % -  \gdef^^e0{\`a} -  \gdef^^e1{\'a} -  \gdef^^e2{\^a} -  \gdef^^e3{\~a} -  \gdef^^e4{\"a} -  \gdef^^e5{\ringaccent a} -  \gdef^^e6{\ae} -  \gdef^^e7{\cedilla c} -  \gdef^^e8{\`e} -  \gdef^^e9{\'e} -  \gdef^^ea{\^e} -  \gdef^^eb{\"e} -  \gdef^^ec{\`{\dotless i}} -  \gdef^^ed{\'{\dotless i}} -  \gdef^^ee{\^{\dotless i}} -  \gdef^^ef{\"{\dotless i}} -  % -  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}} -  \gdef^^f1{\~n} -  \gdef^^f2{\`o} -  \gdef^^f3{\'o} -  \gdef^^f4{\^o} -  \gdef^^f5{\~o} -  \gdef^^f6{\"o} -  \gdef^^f7{$\div$} -  \gdef^^f8{\o} -  \gdef^^f9{\`u} -  \gdef^^fa{\'u} -  \gdef^^fb{\^u} -  \gdef^^fc{\"u} -  \gdef^^fd{\'y} -  \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}} -  \gdef^^ff{\"y} +  \gdefchar^^a0{\tie} +  \gdefchar^^a1{\exclamdown} +  \gdefchar^^a2{{\tcfont \char162}} % cent +  \gdefchar^^a3{\pounds{}} +  \gdefchar^^a4{{\tcfont \char164}} % currency +  \gdefchar^^a5{{\tcfont \char165}} % yen +  \gdefchar^^a6{{\tcfont \char166}} % broken bar +  \gdefchar^^a7{\S} +  \gdefchar^^a8{\"{}} +  \gdefchar^^a9{\copyright{}} +  \gdefchar^^aa{\ordf} +  \gdefchar^^ab{\guillemetleft{}} +  \gdefchar^^ac{\ensuremath\lnot} +  \gdefchar^^ad{\-} +  \gdefchar^^ae{\registeredsymbol{}} +  \gdefchar^^af{\={}} +  % +  \gdefchar^^b0{\textdegree} +  \gdefchar^^b1{$\pm$} +  \gdefchar^^b2{$^2$} +  \gdefchar^^b3{$^3$} +  \gdefchar^^b4{\'{}} +  \gdefchar^^b5{$\mu$} +  \gdefchar^^b6{\P} +  \gdefchar^^b7{\ensuremath\cdot} +  \gdefchar^^b8{\cedilla\ } +  \gdefchar^^b9{$^1$} +  \gdefchar^^ba{\ordm} +  \gdefchar^^bb{\guillemetright{}} +  \gdefchar^^bc{$1\over4$} +  \gdefchar^^bd{$1\over2$} +  \gdefchar^^be{$3\over4$} +  \gdefchar^^bf{\questiondown} +  % +  \gdefchar^^c0{\`A} +  \gdefchar^^c1{\'A} +  \gdefchar^^c2{\^A} +  \gdefchar^^c3{\~A} +  \gdefchar^^c4{\"A} +  \gdefchar^^c5{\ringaccent A} +  \gdefchar^^c6{\AE} +  \gdefchar^^c7{\cedilla C} +  \gdefchar^^c8{\`E} +  \gdefchar^^c9{\'E} +  \gdefchar^^ca{\^E} +  \gdefchar^^cb{\"E} +  \gdefchar^^cc{\`I} +  \gdefchar^^cd{\'I} +  \gdefchar^^ce{\^I} +  \gdefchar^^cf{\"I} +  % +  \gdefchar^^d0{\DH} +  \gdefchar^^d1{\~N} +  \gdefchar^^d2{\`O} +  \gdefchar^^d3{\'O} +  \gdefchar^^d4{\^O} +  \gdefchar^^d5{\~O} +  \gdefchar^^d6{\"O} +  \gdefchar^^d7{$\times$} +  \gdefchar^^d8{\O} +  \gdefchar^^d9{\`U} +  \gdefchar^^da{\'U} +  \gdefchar^^db{\^U} +  \gdefchar^^dc{\"U} +  \gdefchar^^dd{\'Y} +  \gdefchar^^de{\TH} +  \gdefchar^^df{\ss} +  % +  \gdefchar^^e0{\`a} +  \gdefchar^^e1{\'a} +  \gdefchar^^e2{\^a} +  \gdefchar^^e3{\~a} +  \gdefchar^^e4{\"a} +  \gdefchar^^e5{\ringaccent a} +  \gdefchar^^e6{\ae} +  \gdefchar^^e7{\cedilla c} +  \gdefchar^^e8{\`e} +  \gdefchar^^e9{\'e} +  \gdefchar^^ea{\^e} +  \gdefchar^^eb{\"e} +  \gdefchar^^ec{\`{\dotless i}} +  \gdefchar^^ed{\'{\dotless i}} +  \gdefchar^^ee{\^{\dotless i}} +  \gdefchar^^ef{\"{\dotless i}} +  % +  \gdefchar^^f0{\dh} +  \gdefchar^^f1{\~n} +  \gdefchar^^f2{\`o} +  \gdefchar^^f3{\'o} +  \gdefchar^^f4{\^o} +  \gdefchar^^f5{\~o} +  \gdefchar^^f6{\"o} +  \gdefchar^^f7{$\div$} +  \gdefchar^^f8{\o} +  \gdefchar^^f9{\`u} +  \gdefchar^^fa{\'u} +  \gdefchar^^fb{\^u} +  \gdefchar^^fc{\"u} +  \gdefchar^^fd{\'y} +  \gdefchar^^fe{\th} +  \gdefchar^^ff{\"y}  }  % Latin9 (ISO-8859-15) encoding character definitions. @@ -7975,127 +10141,127 @@ should work if nowhere else does.}    % Encoding is almost identical to Latin1.    \latonechardefs    % -  \gdef^^a4{\euro} -  \gdef^^a6{\v S} -  \gdef^^a8{\v s} -  \gdef^^b4{\v Z} -  \gdef^^b8{\v z} -  \gdef^^bc{\OE} -  \gdef^^bd{\oe} -  \gdef^^be{\"Y} +  \gdefchar^^a4{\euro{}} +  \gdefchar^^a6{\v S} +  \gdefchar^^a8{\v s} +  \gdefchar^^b4{\v Z} +  \gdefchar^^b8{\v z} +  \gdefchar^^bc{\OE} +  \gdefchar^^bd{\oe} +  \gdefchar^^be{\"Y}  }  % Latin2 (ISO-8859-2) character definitions.  \def\lattwochardefs{% -  \gdef^^a0{~} -  \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}} -  \gdef^^a2{\u{}} -  \gdef^^a3{\L} -  \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} -  \gdef^^a5{\v L} -  \gdef^^a6{\'S} -  \gdef^^a7{\S} -  \gdef^^a8{\"{}} -  \gdef^^a9{\v S} -  \gdef^^aa{\cedilla S} -  \gdef^^ab{\v T} -  \gdef^^ac{\'Z} -  \gdef^^ad{\-} -  \gdef^^ae{\v Z} -  \gdef^^af{\dotaccent Z} -  % -  \gdef^^b0{\textdegree} -  \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}} -  \gdef^^b2{\missingcharmsg{OGONEK}} -  \gdef^^b3{\l} -  \gdef^^b4{\'{}} -  \gdef^^b5{\v l} -  \gdef^^b6{\'s} -  \gdef^^b7{\v{}} -  \gdef^^b8{\cedilla\ } -  \gdef^^b9{\v s} -  \gdef^^ba{\cedilla s} -  \gdef^^bb{\v t} -  \gdef^^bc{\'z} -  \gdef^^bd{\H{}} -  \gdef^^be{\v z} -  \gdef^^bf{\dotaccent z} -  % -  \gdef^^c0{\'R} -  \gdef^^c1{\'A} -  \gdef^^c2{\^A} -  \gdef^^c3{\u A} -  \gdef^^c4{\"A} -  \gdef^^c5{\'L} -  \gdef^^c6{\'C} -  \gdef^^c7{\cedilla C} -  \gdef^^c8{\v C} -  \gdef^^c9{\'E} -  \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}} -  \gdef^^cb{\"E} -  \gdef^^cc{\v E} -  \gdef^^cd{\'I} -  \gdef^^ce{\^I} -  \gdef^^cf{\v D} -  % -  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}} -  \gdef^^d1{\'N} -  \gdef^^d2{\v N} -  \gdef^^d3{\'O} -  \gdef^^d4{\^O} -  \gdef^^d5{\H O} -  \gdef^^d6{\"O} -  \gdef^^d7{$\times$} -  \gdef^^d8{\v R} -  \gdef^^d9{\ringaccent U}  -  \gdef^^da{\'U} -  \gdef^^db{\H U} -  \gdef^^dc{\"U} -  \gdef^^dd{\'Y} -  \gdef^^de{\cedilla T} -  \gdef^^df{\ss} -  % -  \gdef^^e0{\'r} -  \gdef^^e1{\'a} -  \gdef^^e2{\^a} -  \gdef^^e3{\u a} -  \gdef^^e4{\"a} -  \gdef^^e5{\'l} -  \gdef^^e6{\'c} -  \gdef^^e7{\cedilla c} -  \gdef^^e8{\v c} -  \gdef^^e9{\'e} -  \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}} -  \gdef^^eb{\"e} -  \gdef^^ec{\v e} -  \gdef^^ed{\'\i} -  \gdef^^ee{\^\i} -  \gdef^^ef{\v d} -  % -  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}} -  \gdef^^f1{\'n} -  \gdef^^f2{\v n} -  \gdef^^f3{\'o} -  \gdef^^f4{\^o} -  \gdef^^f5{\H o} -  \gdef^^f6{\"o} -  \gdef^^f7{$\div$} -  \gdef^^f8{\v r} -  \gdef^^f9{\ringaccent u} -  \gdef^^fa{\'u} -  \gdef^^fb{\H u} -  \gdef^^fc{\"u} -  \gdef^^fd{\'y} -  \gdef^^fe{\cedilla t} -  \gdef^^ff{\dotaccent{}} +  \gdefchar^^a0{\tie} +  \gdefchar^^a1{\ogonek{A}} +  \gdefchar^^a2{\u{}} +  \gdefchar^^a3{\L} +  \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}} +  \gdefchar^^a5{\v L} +  \gdefchar^^a6{\'S} +  \gdefchar^^a7{\S} +  \gdefchar^^a8{\"{}} +  \gdefchar^^a9{\v S} +  \gdefchar^^aa{\cedilla S} +  \gdefchar^^ab{\v T} +  \gdefchar^^ac{\'Z} +  \gdefchar^^ad{\-} +  \gdefchar^^ae{\v Z} +  \gdefchar^^af{\dotaccent Z} +  % +  \gdefchar^^b0{\textdegree{}} +  \gdefchar^^b1{\ogonek{a}} +  \gdefchar^^b2{\ogonek{ }} +  \gdefchar^^b3{\l} +  \gdefchar^^b4{\'{}} +  \gdefchar^^b5{\v l} +  \gdefchar^^b6{\'s} +  \gdefchar^^b7{\v{}} +  \gdefchar^^b8{\cedilla\ } +  \gdefchar^^b9{\v s} +  \gdefchar^^ba{\cedilla s} +  \gdefchar^^bb{\v t} +  \gdefchar^^bc{\'z} +  \gdefchar^^bd{\H{}} +  \gdefchar^^be{\v z} +  \gdefchar^^bf{\dotaccent z} +  % +  \gdefchar^^c0{\'R} +  \gdefchar^^c1{\'A} +  \gdefchar^^c2{\^A} +  \gdefchar^^c3{\u A} +  \gdefchar^^c4{\"A} +  \gdefchar^^c5{\'L} +  \gdefchar^^c6{\'C} +  \gdefchar^^c7{\cedilla C} +  \gdefchar^^c8{\v C} +  \gdefchar^^c9{\'E} +  \gdefchar^^ca{\ogonek{E}} +  \gdefchar^^cb{\"E} +  \gdefchar^^cc{\v E} +  \gdefchar^^cd{\'I} +  \gdefchar^^ce{\^I} +  \gdefchar^^cf{\v D} +  % +  \gdefchar^^d0{\DH} +  \gdefchar^^d1{\'N} +  \gdefchar^^d2{\v N} +  \gdefchar^^d3{\'O} +  \gdefchar^^d4{\^O} +  \gdefchar^^d5{\H O} +  \gdefchar^^d6{\"O} +  \gdefchar^^d7{$\times$} +  \gdefchar^^d8{\v R} +  \gdefchar^^d9{\ringaccent U} +  \gdefchar^^da{\'U} +  \gdefchar^^db{\H U} +  \gdefchar^^dc{\"U} +  \gdefchar^^dd{\'Y} +  \gdefchar^^de{\cedilla T} +  \gdefchar^^df{\ss} +  % +  \gdefchar^^e0{\'r} +  \gdefchar^^e1{\'a} +  \gdefchar^^e2{\^a} +  \gdefchar^^e3{\u a} +  \gdefchar^^e4{\"a} +  \gdefchar^^e5{\'l} +  \gdefchar^^e6{\'c} +  \gdefchar^^e7{\cedilla c} +  \gdefchar^^e8{\v c} +  \gdefchar^^e9{\'e} +  \gdefchar^^ea{\ogonek{e}} +  \gdefchar^^eb{\"e} +  \gdefchar^^ec{\v e} +  \gdefchar^^ed{\'{\dotless{i}}} +  \gdefchar^^ee{\^{\dotless{i}}} +  \gdefchar^^ef{\v d} +  % +  \gdefchar^^f0{\dh} +  \gdefchar^^f1{\'n} +  \gdefchar^^f2{\v n} +  \gdefchar^^f3{\'o} +  \gdefchar^^f4{\^o} +  \gdefchar^^f5{\H o} +  \gdefchar^^f6{\"o} +  \gdefchar^^f7{$\div$} +  \gdefchar^^f8{\v r} +  \gdefchar^^f9{\ringaccent u} +  \gdefchar^^fa{\'u} +  \gdefchar^^fb{\H u} +  \gdefchar^^fc{\"u} +  \gdefchar^^fd{\'y} +  \gdefchar^^fe{\cedilla t} +  \gdefchar^^ff{\dotaccent{}}  }  % UTF-8 character definitions. -%  +%  % This code to support UTF-8 is based on LaTeX's utf8.def, with some  % changes for Texinfo conventions.  It is included here under the GPL by  % permission from Frank Mittelbach and the LaTeX team. -%  +%  \newcount\countUTFx  \newcount\countUTFy  \newcount\countUTFz @@ -8117,38 +10283,94 @@ should work if nowhere else does.}    \fi  } +% Give non-ASCII bytes the active definitions for processing UTF-8 sequences  \begingroup    \catcode`\~13 +  \catcode`\$12    \catcode`\"12 +  % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp +  % substituting ~ and $ with a character token of that value.    \def\UTFviiiLoop{%      \global\catcode\countUTFx\active      \uccode`\~\countUTFx +    \uccode`\$\countUTFx      \uppercase\expandafter{\UTFviiiTmp}%      \advance\countUTFx by 1      \ifnum\countUTFx < \countUTFy        \expandafter\UTFviiiLoop      \fi} +  % For bytes other than the first in a UTF-8 sequence.  Not expected to +  % be expanded except when writing to auxiliary files. +  \countUTFx = "80 +  \countUTFy = "C2 +  \def\UTFviiiTmp{% +    \gdef~{% +        \ifpassthroughchars $\fi}}% +  \UTFviiiLoop +    \countUTFx = "C2    \countUTFy = "E0    \def\UTFviiiTmp{% -    \xdef~{\noexpand\UTFviiiTwoOctets\string~}} +    \gdef~{% +        \ifpassthroughchars $% +        \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%    \UTFviiiLoop    \countUTFx = "E0    \countUTFy = "F0    \def\UTFviiiTmp{% -    \xdef~{\noexpand\UTFviiiThreeOctets\string~}} +    \gdef~{% +        \ifpassthroughchars $% +        \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%    \UTFviiiLoop    \countUTFx = "F0    \countUTFy = "F4    \def\UTFviiiTmp{% -    \xdef~{\noexpand\UTFviiiFourOctets\string~}} +    \gdef~{% +        \ifpassthroughchars $% +        \else\expandafter\UTFviiiFourOctets\expandafter$\fi +        }}%    \UTFviiiLoop  \endgroup +\def\globallet{\global\let} % save some \expandafter's below + +% @U{xxxx} to produce U+xxxx, if we support it. +\def\U#1{% +  \expandafter\ifx\csname uni:#1\endcsname \relax +    \iftxinativeunicodecapable +      % All Unicode characters can be used if native Unicode handling is +      % active.  However, if the font does not have the glyph, +      % letters are missing. +      \begingroup +        \uccode`\.="#1\relax +        \uppercase{.} +      \endgroup +    \else +      \errhelp = \EMsimple	 +      \errmessage{Unicode character U+#1 not supported, sorry}% +    \fi +  \else +    \csname uni:#1\endcsname +  \fi +} + +% These macros are used here to construct the name of a control +% sequence to be defined. +\def\UTFviiiTwoOctetsName#1#2{% +  \csname u8:#1\string #2\endcsname}% +\def\UTFviiiThreeOctetsName#1#2#3{% +  \csname u8:#1\string #2\string #3\endcsname}% +\def\UTFviiiFourOctetsName#1#2#3#4{% +  \csname u8:#1\string #2\string #3\string #4\endcsname}% + +% For UTF-8 byte sequences (TeX, e-TeX and pdfTeX), +% provide a definition macro to replace a Unicode character; +% this gets used by the @U command +%  \begingroup    \catcode`\"=12    \catcode`\<=12 @@ -8157,449 +10379,839 @@ should work if nowhere else does.}    \catcode`\;=12    \catcode`\!=12    \catcode`\~=13 - -  \gdef\DeclareUnicodeCharacter#1#2{% +  \gdef\DeclareUnicodeCharacterUTFviii#1#2{%      \countUTFz = "#1\relax -    \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%      \begingroup        \parseXMLCharref -      \def\UTFviiiTwoOctets##1##2{% -        \csname u8:##1\string ##2\endcsname}% -      \def\UTFviiiThreeOctets##1##2##3{% -        \csname u8:##1\string ##2\string ##3\endcsname}% -      \def\UTFviiiFourOctets##1##2##3##4{% -        \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% -      \expandafter\expandafter\expandafter\expandafter -       \expandafter\expandafter\expandafter -       \gdef\UTFviiiTmp{#2}% +     +      % Give \u8:... its definition.  The sequence of seven \expandafter's +      % expands after the \gdef three times, e.g. +      % +      % 1.  \UTFviiTwoOctetsName B1 B2 +      % 2.  \csname u8:B1 \string B2 \endcsname +      % 3.  \u8: B1 B2  (a single control sequence token) +      % +      \expandafter\expandafter +      \expandafter\expandafter +      \expandafter\expandafter +      \expandafter\gdef       \UTFviiiTmp{#2}% +      %  +      \expandafter\ifx\csname uni:#1\endcsname \relax \else +       \message{Internal error, already defined: #1}% +      \fi +      % +      % define an additional control sequence for this code point. +      \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp      \endgroup} - +  % +  % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp +  % to the corresponding UTF-8 sequence.    \gdef\parseXMLCharref{%      \ifnum\countUTFz < "A0\relax        \errhelp = \EMsimple        \errmessage{Cannot define Unicode char value < 00A0}%      \else\ifnum\countUTFz < "800\relax        \parseUTFviiiA,% -      \parseUTFviiiB C\UTFviiiTwoOctets.,% +      \parseUTFviiiB C\UTFviiiTwoOctetsName.,%      \else\ifnum\countUTFz < "10000\relax        \parseUTFviiiA;%        \parseUTFviiiA,% -      \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% +      \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%      \else        \parseUTFviiiA;%        \parseUTFviiiA,%        \parseUTFviiiA!% -      \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% +      \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%      \fi\fi\fi    } +  % Extract a byte from the end of the UTF-8 representation of \countUTFx. +  % It must be a non-initial byte in the sequence. +  % Change \uccode of #1 for it to be used in \parseUTFviiiB as one +  % of the bytes.    \gdef\parseUTFviiiA#1{%      \countUTFx = \countUTFz      \divide\countUTFz by 64 -    \countUTFy = \countUTFz +    \countUTFy = \countUTFz  % Save to be the future value of \countUTFz.      \multiply\countUTFz by 64 +     +    % \countUTFz is now \countUTFx with the last 5 bits cleared.  Subtract +    % in order to get the last five bits.      \advance\countUTFx by -\countUTFz + +    % Convert this to the byte in the UTF-8 sequence.      \advance\countUTFx by 128      \uccode `#1\countUTFx      \countUTFz = \countUTFy} +  % Used to put a UTF-8 byte sequence into \UTFviiiTmp +  % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8 +  %    sequence. +  % #2 is one of the \UTFviii*OctetsName macros. +  % #3 is always a full stop (.) +  % #4 is a template for the other bytes in the sequence.  The values for these +  %    bytes is substituted in here with \uppercase using the \uccode's.    \gdef\parseUTFviiiB#1#2#3#4{%      \advance\countUTFz by "#10\relax      \uccode `#3\countUTFz      \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}  \endgroup +% For native Unicode handling (XeTeX and LuaTeX), +% provide a definition macro that sets a catcode to `other' non-globally +% +\def\DeclareUnicodeCharacterNativeOther#1#2{% +  \catcode"#1=\other +} + +% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M +% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) +% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) +% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A +% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B +%  +% Many of our renditions are less than wonderful, and all the missing +% characters are available somewhere.  Loading the necessary fonts +% awaits user request.  We can't truly support Unicode without +% reimplementing everything that's been done in LaTeX for many years, +% plus probably using luatex or xetex, and who knows what else. +% We won't be doing that here in this simple file.  But we can try to at +% least make most of the characters not bomb out. +% +\def\unicodechardefs{% +  \DeclareUnicodeCharacter{00A0}{\tie}% +  \DeclareUnicodeCharacter{00A1}{\exclamdown}% +  \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent +  \DeclareUnicodeCharacter{00A3}{\pounds{}}% +  \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency +  \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen +  \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar +  \DeclareUnicodeCharacter{00A7}{\S}% +  \DeclareUnicodeCharacter{00A8}{\"{ }}% +  \DeclareUnicodeCharacter{00A9}{\copyright{}}% +  \DeclareUnicodeCharacter{00AA}{\ordf}% +  \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}% +  \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}% +  \DeclareUnicodeCharacter{00AD}{\-}% +  \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% +  \DeclareUnicodeCharacter{00AF}{\={ }}% +  % +  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}% +  \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% +  \DeclareUnicodeCharacter{00B2}{$^2$}% +  \DeclareUnicodeCharacter{00B3}{$^3$}% +  \DeclareUnicodeCharacter{00B4}{\'{ }}% +  \DeclareUnicodeCharacter{00B5}{$\mu$}% +  \DeclareUnicodeCharacter{00B6}{\P}% +  \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}% +  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}% +  \DeclareUnicodeCharacter{00B9}{$^1$}% +  \DeclareUnicodeCharacter{00BA}{\ordm}% +  \DeclareUnicodeCharacter{00BB}{\guillemetright{}}% +  \DeclareUnicodeCharacter{00BC}{$1\over4$}% +  \DeclareUnicodeCharacter{00BD}{$1\over2$}% +  \DeclareUnicodeCharacter{00BE}{$3\over4$}% +  \DeclareUnicodeCharacter{00BF}{\questiondown}% +  % +  \DeclareUnicodeCharacter{00C0}{\`A}% +  \DeclareUnicodeCharacter{00C1}{\'A}% +  \DeclareUnicodeCharacter{00C2}{\^A}% +  \DeclareUnicodeCharacter{00C3}{\~A}% +  \DeclareUnicodeCharacter{00C4}{\"A}% +  \DeclareUnicodeCharacter{00C5}{\AA}% +  \DeclareUnicodeCharacter{00C6}{\AE}% +  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}% +  \DeclareUnicodeCharacter{00C8}{\`E}% +  \DeclareUnicodeCharacter{00C9}{\'E}% +  \DeclareUnicodeCharacter{00CA}{\^E}% +  \DeclareUnicodeCharacter{00CB}{\"E}% +  \DeclareUnicodeCharacter{00CC}{\`I}% +  \DeclareUnicodeCharacter{00CD}{\'I}% +  \DeclareUnicodeCharacter{00CE}{\^I}% +  \DeclareUnicodeCharacter{00CF}{\"I}% +  % +  \DeclareUnicodeCharacter{00D0}{\DH}% +  \DeclareUnicodeCharacter{00D1}{\~N}% +  \DeclareUnicodeCharacter{00D2}{\`O}% +  \DeclareUnicodeCharacter{00D3}{\'O}% +  \DeclareUnicodeCharacter{00D4}{\^O}% +  \DeclareUnicodeCharacter{00D5}{\~O}% +  \DeclareUnicodeCharacter{00D6}{\"O}% +  \DeclareUnicodeCharacter{00D7}{\ensuremath\times}% +  \DeclareUnicodeCharacter{00D8}{\O}% +  \DeclareUnicodeCharacter{00D9}{\`U}% +  \DeclareUnicodeCharacter{00DA}{\'U}% +  \DeclareUnicodeCharacter{00DB}{\^U}% +  \DeclareUnicodeCharacter{00DC}{\"U}% +  \DeclareUnicodeCharacter{00DD}{\'Y}% +  \DeclareUnicodeCharacter{00DE}{\TH}% +  \DeclareUnicodeCharacter{00DF}{\ss}% +  % +  \DeclareUnicodeCharacter{00E0}{\`a}% +  \DeclareUnicodeCharacter{00E1}{\'a}% +  \DeclareUnicodeCharacter{00E2}{\^a}% +  \DeclareUnicodeCharacter{00E3}{\~a}% +  \DeclareUnicodeCharacter{00E4}{\"a}% +  \DeclareUnicodeCharacter{00E5}{\aa}% +  \DeclareUnicodeCharacter{00E6}{\ae}% +  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}% +  \DeclareUnicodeCharacter{00E8}{\`e}% +  \DeclareUnicodeCharacter{00E9}{\'e}% +  \DeclareUnicodeCharacter{00EA}{\^e}% +  \DeclareUnicodeCharacter{00EB}{\"e}% +  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}% +  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}% +  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}% +  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}% +  % +  \DeclareUnicodeCharacter{00F0}{\dh}% +  \DeclareUnicodeCharacter{00F1}{\~n}% +  \DeclareUnicodeCharacter{00F2}{\`o}% +  \DeclareUnicodeCharacter{00F3}{\'o}% +  \DeclareUnicodeCharacter{00F4}{\^o}% +  \DeclareUnicodeCharacter{00F5}{\~o}% +  \DeclareUnicodeCharacter{00F6}{\"o}% +  \DeclareUnicodeCharacter{00F7}{\ensuremath\div}% +  \DeclareUnicodeCharacter{00F8}{\o}% +  \DeclareUnicodeCharacter{00F9}{\`u}% +  \DeclareUnicodeCharacter{00FA}{\'u}% +  \DeclareUnicodeCharacter{00FB}{\^u}% +  \DeclareUnicodeCharacter{00FC}{\"u}% +  \DeclareUnicodeCharacter{00FD}{\'y}% +  \DeclareUnicodeCharacter{00FE}{\th}% +  \DeclareUnicodeCharacter{00FF}{\"y}% +  % +  \DeclareUnicodeCharacter{0100}{\=A}% +  \DeclareUnicodeCharacter{0101}{\=a}% +  \DeclareUnicodeCharacter{0102}{\u{A}}% +  \DeclareUnicodeCharacter{0103}{\u{a}}% +  \DeclareUnicodeCharacter{0104}{\ogonek{A}}% +  \DeclareUnicodeCharacter{0105}{\ogonek{a}}% +  \DeclareUnicodeCharacter{0106}{\'C}% +  \DeclareUnicodeCharacter{0107}{\'c}% +  \DeclareUnicodeCharacter{0108}{\^C}% +  \DeclareUnicodeCharacter{0109}{\^c}% +  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}% +  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}% +  \DeclareUnicodeCharacter{010C}{\v{C}}% +  \DeclareUnicodeCharacter{010D}{\v{c}}% +  \DeclareUnicodeCharacter{010E}{\v{D}}% +  \DeclareUnicodeCharacter{010F}{d'}% +  % +  \DeclareUnicodeCharacter{0110}{\DH}% +  \DeclareUnicodeCharacter{0111}{\dh}% +  \DeclareUnicodeCharacter{0112}{\=E}% +  \DeclareUnicodeCharacter{0113}{\=e}% +  \DeclareUnicodeCharacter{0114}{\u{E}}% +  \DeclareUnicodeCharacter{0115}{\u{e}}% +  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}% +  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}% +  \DeclareUnicodeCharacter{0118}{\ogonek{E}}% +  \DeclareUnicodeCharacter{0119}{\ogonek{e}}% +  \DeclareUnicodeCharacter{011A}{\v{E}}% +  \DeclareUnicodeCharacter{011B}{\v{e}}% +  \DeclareUnicodeCharacter{011C}{\^G}% +  \DeclareUnicodeCharacter{011D}{\^g}% +  \DeclareUnicodeCharacter{011E}{\u{G}}% +  \DeclareUnicodeCharacter{011F}{\u{g}}% +  % +  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}% +  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}% +  \DeclareUnicodeCharacter{0122}{\cedilla{G}}% +  \DeclareUnicodeCharacter{0123}{\cedilla{g}}% +  \DeclareUnicodeCharacter{0124}{\^H}% +  \DeclareUnicodeCharacter{0125}{\^h}% +  \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}% +  \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}% +  \DeclareUnicodeCharacter{0128}{\~I}% +  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}% +  \DeclareUnicodeCharacter{012A}{\=I}% +  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}% +  \DeclareUnicodeCharacter{012C}{\u{I}}% +  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}% +  \DeclareUnicodeCharacter{012E}{\ogonek{I}}% +  \DeclareUnicodeCharacter{012F}{\ogonek{i}}% +  % +  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}% +  \DeclareUnicodeCharacter{0131}{\dotless{i}}% +  \DeclareUnicodeCharacter{0132}{IJ}% +  \DeclareUnicodeCharacter{0133}{ij}% +  \DeclareUnicodeCharacter{0134}{\^J}% +  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}% +  \DeclareUnicodeCharacter{0136}{\cedilla{K}}% +  \DeclareUnicodeCharacter{0137}{\cedilla{k}}% +  \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}% +  \DeclareUnicodeCharacter{0139}{\'L}% +  \DeclareUnicodeCharacter{013A}{\'l}% +  \DeclareUnicodeCharacter{013B}{\cedilla{L}}% +  \DeclareUnicodeCharacter{013C}{\cedilla{l}}% +  \DeclareUnicodeCharacter{013D}{L'}% should kern +  \DeclareUnicodeCharacter{013E}{l'}% should kern +  \DeclareUnicodeCharacter{013F}{L\U{00B7}}% +  % +  \DeclareUnicodeCharacter{0140}{l\U{00B7}}% +  \DeclareUnicodeCharacter{0141}{\L}% +  \DeclareUnicodeCharacter{0142}{\l}% +  \DeclareUnicodeCharacter{0143}{\'N}% +  \DeclareUnicodeCharacter{0144}{\'n}% +  \DeclareUnicodeCharacter{0145}{\cedilla{N}}% +  \DeclareUnicodeCharacter{0146}{\cedilla{n}}% +  \DeclareUnicodeCharacter{0147}{\v{N}}% +  \DeclareUnicodeCharacter{0148}{\v{n}}% +  \DeclareUnicodeCharacter{0149}{'n}% +  \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}% +  \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}% +  \DeclareUnicodeCharacter{014C}{\=O}% +  \DeclareUnicodeCharacter{014D}{\=o}% +  \DeclareUnicodeCharacter{014E}{\u{O}}% +  \DeclareUnicodeCharacter{014F}{\u{o}}% +  % +  \DeclareUnicodeCharacter{0150}{\H{O}}% +  \DeclareUnicodeCharacter{0151}{\H{o}}% +  \DeclareUnicodeCharacter{0152}{\OE}% +  \DeclareUnicodeCharacter{0153}{\oe}% +  \DeclareUnicodeCharacter{0154}{\'R}% +  \DeclareUnicodeCharacter{0155}{\'r}% +  \DeclareUnicodeCharacter{0156}{\cedilla{R}}% +  \DeclareUnicodeCharacter{0157}{\cedilla{r}}% +  \DeclareUnicodeCharacter{0158}{\v{R}}% +  \DeclareUnicodeCharacter{0159}{\v{r}}% +  \DeclareUnicodeCharacter{015A}{\'S}% +  \DeclareUnicodeCharacter{015B}{\'s}% +  \DeclareUnicodeCharacter{015C}{\^S}% +  \DeclareUnicodeCharacter{015D}{\^s}% +  \DeclareUnicodeCharacter{015E}{\cedilla{S}}% +  \DeclareUnicodeCharacter{015F}{\cedilla{s}}% +  % +  \DeclareUnicodeCharacter{0160}{\v{S}}% +  \DeclareUnicodeCharacter{0161}{\v{s}}% +  \DeclareUnicodeCharacter{0162}{\cedilla{T}}% +  \DeclareUnicodeCharacter{0163}{\cedilla{t}}% +  \DeclareUnicodeCharacter{0164}{\v{T}}% +  \DeclareUnicodeCharacter{0165}{\v{t}}% +  \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}% +  \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}% +  \DeclareUnicodeCharacter{0168}{\~U}% +  \DeclareUnicodeCharacter{0169}{\~u}% +  \DeclareUnicodeCharacter{016A}{\=U}% +  \DeclareUnicodeCharacter{016B}{\=u}% +  \DeclareUnicodeCharacter{016C}{\u{U}}% +  \DeclareUnicodeCharacter{016D}{\u{u}}% +  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}% +  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}% +  % +  \DeclareUnicodeCharacter{0170}{\H{U}}% +  \DeclareUnicodeCharacter{0171}{\H{u}}% +  \DeclareUnicodeCharacter{0172}{\ogonek{U}}% +  \DeclareUnicodeCharacter{0173}{\ogonek{u}}% +  \DeclareUnicodeCharacter{0174}{\^W}% +  \DeclareUnicodeCharacter{0175}{\^w}% +  \DeclareUnicodeCharacter{0176}{\^Y}% +  \DeclareUnicodeCharacter{0177}{\^y}% +  \DeclareUnicodeCharacter{0178}{\"Y}% +  \DeclareUnicodeCharacter{0179}{\'Z}% +  \DeclareUnicodeCharacter{017A}{\'z}% +  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}% +  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}% +  \DeclareUnicodeCharacter{017D}{\v{Z}}% +  \DeclareUnicodeCharacter{017E}{\v{z}}% +  \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}% +  % +  \DeclareUnicodeCharacter{01C4}{D\v{Z}}% +  \DeclareUnicodeCharacter{01C5}{D\v{z}}% +  \DeclareUnicodeCharacter{01C6}{d\v{z}}% +  \DeclareUnicodeCharacter{01C7}{LJ}% +  \DeclareUnicodeCharacter{01C8}{Lj}% +  \DeclareUnicodeCharacter{01C9}{lj}% +  \DeclareUnicodeCharacter{01CA}{NJ}% +  \DeclareUnicodeCharacter{01CB}{Nj}% +  \DeclareUnicodeCharacter{01CC}{nj}% +  \DeclareUnicodeCharacter{01CD}{\v{A}}% +  \DeclareUnicodeCharacter{01CE}{\v{a}}% +  \DeclareUnicodeCharacter{01CF}{\v{I}}% +  % +  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}% +  \DeclareUnicodeCharacter{01D1}{\v{O}}% +  \DeclareUnicodeCharacter{01D2}{\v{o}}% +  \DeclareUnicodeCharacter{01D3}{\v{U}}% +  \DeclareUnicodeCharacter{01D4}{\v{u}}% +  % +  \DeclareUnicodeCharacter{01E2}{\={\AE}}% +  \DeclareUnicodeCharacter{01E3}{\={\ae}}% +  \DeclareUnicodeCharacter{01E6}{\v{G}}% +  \DeclareUnicodeCharacter{01E7}{\v{g}}% +  \DeclareUnicodeCharacter{01E8}{\v{K}}% +  \DeclareUnicodeCharacter{01E9}{\v{k}}% +  % +  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}% +  \DeclareUnicodeCharacter{01F1}{DZ}% +  \DeclareUnicodeCharacter{01F2}{Dz}% +  \DeclareUnicodeCharacter{01F3}{dz}% +  \DeclareUnicodeCharacter{01F4}{\'G}% +  \DeclareUnicodeCharacter{01F5}{\'g}% +  \DeclareUnicodeCharacter{01F8}{\`N}% +  \DeclareUnicodeCharacter{01F9}{\`n}% +  \DeclareUnicodeCharacter{01FC}{\'{\AE}}% +  \DeclareUnicodeCharacter{01FD}{\'{\ae}}% +  \DeclareUnicodeCharacter{01FE}{\'{\O}}% +  \DeclareUnicodeCharacter{01FF}{\'{\o}}% +  % +  \DeclareUnicodeCharacter{021E}{\v{H}}% +  \DeclareUnicodeCharacter{021F}{\v{h}}% +  % +  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}% +  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}% +  \DeclareUnicodeCharacter{0228}{\cedilla{E}}% +  \DeclareUnicodeCharacter{0229}{\cedilla{e}}% +  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}% +  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}% +  % +  \DeclareUnicodeCharacter{0232}{\=Y}% +  \DeclareUnicodeCharacter{0233}{\=y}% +  \DeclareUnicodeCharacter{0237}{\dotless{j}}% +  % +  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% +  % +  % Greek letters upper case +  \DeclareUnicodeCharacter{0391}{{\it A}}% +  \DeclareUnicodeCharacter{0392}{{\it B}}% +  \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}% +  \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}% +  \DeclareUnicodeCharacter{0395}{{\it E}}% +  \DeclareUnicodeCharacter{0396}{{\it Z}}% +  \DeclareUnicodeCharacter{0397}{{\it H}}% +  \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}% +  \DeclareUnicodeCharacter{0399}{{\it I}}% +  \DeclareUnicodeCharacter{039A}{{\it K}}% +  \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}% +  \DeclareUnicodeCharacter{039C}{{\it M}}% +  \DeclareUnicodeCharacter{039D}{{\it N}}% +  \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}% +  \DeclareUnicodeCharacter{039F}{{\it O}}% +  \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}% +  \DeclareUnicodeCharacter{03A1}{{\it P}}% +  %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma +  \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}% +  \DeclareUnicodeCharacter{03A4}{{\it T}}% +  \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}% +  \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}% +  \DeclareUnicodeCharacter{03A7}{{\it X}}% +  \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}% +  \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}% +  % +  % Vowels with accents +  \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}% +  \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}% +  \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}% +  \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}% +  \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}% +  \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}% +  % +  % Standalone accent +  \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}% +  % +  % Greek letters lower case +  \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}% +  \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}% +  \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}% +  \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}% +  \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}% +  \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}% +  \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}% +  \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}% +  \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}% +  \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}% +  \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}% +  \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}% +  \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}% +  \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}% +  \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron +  \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}% +  \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}% +  \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}% +  \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}% +  \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}% +  \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}% +  \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}% +  \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}% +  \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}% +  \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}% +  % +  % More Greek vowels with accents +  \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}% +  \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}% +  \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}% +  \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}% +  \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}% +  % +  % Variant Greek letters +  \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}% +  \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}% +  \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}% +  % +  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}% +  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}% +  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}% +  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}% +  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}% +  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}% +  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}% +  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}% +  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}% +  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}% +  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}% +  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}% +  % +  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}% +  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}% +  % +  \DeclareUnicodeCharacter{1E20}{\=G}% +  \DeclareUnicodeCharacter{1E21}{\=g}% +  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}% +  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}% +  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}% +  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}% +  \DeclareUnicodeCharacter{1E26}{\"H}% +  \DeclareUnicodeCharacter{1E27}{\"h}% +  % +  \DeclareUnicodeCharacter{1E30}{\'K}% +  \DeclareUnicodeCharacter{1E31}{\'k}% +  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}% +  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}% +  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}% +  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}% +  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}% +  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}% +  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}% +  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}% +  \DeclareUnicodeCharacter{1E3E}{\'M}% +  \DeclareUnicodeCharacter{1E3F}{\'m}% +  % +  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}% +  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}% +  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}% +  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}% +  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}% +  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}% +  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}% +  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}% +  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}% +  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}% +  % +  \DeclareUnicodeCharacter{1E54}{\'P}% +  \DeclareUnicodeCharacter{1E55}{\'p}% +  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}% +  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}% +  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}% +  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}% +  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}% +  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}% +  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}% +  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}% +  % +  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}% +  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}% +  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}% +  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}% +  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}% +  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}% +  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}% +  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}% +  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}% +  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}% +  % +  \DeclareUnicodeCharacter{1E7C}{\~V}% +  \DeclareUnicodeCharacter{1E7D}{\~v}% +  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}% +  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}% +  % +  \DeclareUnicodeCharacter{1E80}{\`W}% +  \DeclareUnicodeCharacter{1E81}{\`w}% +  \DeclareUnicodeCharacter{1E82}{\'W}% +  \DeclareUnicodeCharacter{1E83}{\'w}% +  \DeclareUnicodeCharacter{1E84}{\"W}% +  \DeclareUnicodeCharacter{1E85}{\"w}% +  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}% +  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}% +  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}% +  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}% +  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}% +  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}% +  \DeclareUnicodeCharacter{1E8C}{\"X}% +  \DeclareUnicodeCharacter{1E8D}{\"x}% +  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}% +  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}% +  % +  \DeclareUnicodeCharacter{1E90}{\^Z}% +  \DeclareUnicodeCharacter{1E91}{\^z}% +  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}% +  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}% +  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}% +  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}% +  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}% +  \DeclareUnicodeCharacter{1E97}{\"t}% +  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}% +  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}% +  % +  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}% +  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}% +  % +  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}% +  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}% +  \DeclareUnicodeCharacter{1EBC}{\~E}% +  \DeclareUnicodeCharacter{1EBD}{\~e}% +  % +  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}% +  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}% +  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}% +  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}% +  % +  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}% +  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}% +  % +  \DeclareUnicodeCharacter{1EF2}{\`Y}% +  \DeclareUnicodeCharacter{1EF3}{\`y}% +  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}% +  % +  \DeclareUnicodeCharacter{1EF8}{\~Y}% +  \DeclareUnicodeCharacter{1EF9}{\~y}% +  % +  % Punctuation +  \DeclareUnicodeCharacter{2013}{--}% +  \DeclareUnicodeCharacter{2014}{---}% +  \DeclareUnicodeCharacter{2018}{\quoteleft{}}% +  \DeclareUnicodeCharacter{2019}{\quoteright{}}% +  \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}% +  \DeclareUnicodeCharacter{201C}{\quotedblleft{}}% +  \DeclareUnicodeCharacter{201D}{\quotedblright{}}% +  \DeclareUnicodeCharacter{201E}{\quotedblbase{}}% +  \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}% +  \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}% +  \DeclareUnicodeCharacter{2022}{\bullet{}}% +  \DeclareUnicodeCharacter{202F}{\thinspace}% +  \DeclareUnicodeCharacter{2026}{\dots{}}% +  \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}% +  \DeclareUnicodeCharacter{203A}{\guilsinglright{}}% +  % +  \DeclareUnicodeCharacter{20AC}{\euro{}}% +  % +  \DeclareUnicodeCharacter{2192}{\expansion{}}% +  \DeclareUnicodeCharacter{21D2}{\result{}}% +  % +  % Mathematical symbols +  \DeclareUnicodeCharacter{2200}{\ensuremath\forall}% +  \DeclareUnicodeCharacter{2203}{\ensuremath\exists}% +  \DeclareUnicodeCharacter{2208}{\ensuremath\in}% +  \DeclareUnicodeCharacter{2212}{\minus{}}% +  \DeclareUnicodeCharacter{2217}{\ast}% +  \DeclareUnicodeCharacter{221E}{\ensuremath\infty}% +  \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}% +  \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}% +  \DeclareUnicodeCharacter{2229}{\ensuremath\cap}% +  \DeclareUnicodeCharacter{2261}{\equiv{}}% +  \DeclareUnicodeCharacter{2264}{\ensuremath\leq}% +  \DeclareUnicodeCharacter{2265}{\ensuremath\geq}% +  \DeclareUnicodeCharacter{2282}{\ensuremath\subset}% +  \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}% +  % +  \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}% +  \DeclareUnicodeCharacter{2032}{\ensuremath\prime}% +  \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}% +  \DeclareUnicodeCharacter{2111}{\ensuremath\Im}% +  \DeclareUnicodeCharacter{2113}{\ensuremath\ell}% +  \DeclareUnicodeCharacter{2118}{\ensuremath\wp}% +  \DeclareUnicodeCharacter{211C}{\ensuremath\Re}% +  \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}% +  \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}% +  \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}% +  \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}% +  \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}% +  \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}% +  \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}% +  \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}% +  \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}% +  \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}% +  \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}% +  \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}% +  \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}% +  \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}% +  \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}% +  \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}% +  \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}% +  \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}% +  \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}% +  \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}% +  \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}% +  \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}% +  \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}% +  \DeclareUnicodeCharacter{2202}{\ensuremath\partial}% +  \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}% +  \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}% +  \DeclareUnicodeCharacter{2209}{\ensuremath\notin}% +  \DeclareUnicodeCharacter{220B}{\ensuremath\owns}% +  \DeclareUnicodeCharacter{220F}{\ensuremath\prod}% +  \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}% +  \DeclareUnicodeCharacter{2211}{\ensuremath\sum}% +  \DeclareUnicodeCharacter{2213}{\ensuremath\mp}% +  \DeclareUnicodeCharacter{2218}{\ensuremath\circ}% +  \DeclareUnicodeCharacter{221A}{\ensuremath\surd}% +  \DeclareUnicodeCharacter{221D}{\ensuremath\propto}% +  \DeclareUnicodeCharacter{2220}{\ensuremath\angle}% +  \DeclareUnicodeCharacter{2223}{\ensuremath\mid}% +  \DeclareUnicodeCharacter{2228}{\ensuremath\vee}% +  \DeclareUnicodeCharacter{222A}{\ensuremath\cup}% +  \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}% +  \DeclareUnicodeCharacter{222E}{\ensuremath\oint}% +  \DeclareUnicodeCharacter{223C}{\ensuremath\sim}% +  \DeclareUnicodeCharacter{2240}{\ensuremath\wr}% +  \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}% +  \DeclareUnicodeCharacter{2245}{\ensuremath\cong}% +  \DeclareUnicodeCharacter{2248}{\ensuremath\approx}% +  \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}% +  \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}% +  \DeclareUnicodeCharacter{2260}{\ensuremath\neq}% +  \DeclareUnicodeCharacter{226A}{\ensuremath\ll}% +  \DeclareUnicodeCharacter{226B}{\ensuremath\gg}% +  \DeclareUnicodeCharacter{227A}{\ensuremath\prec}% +  \DeclareUnicodeCharacter{227B}{\ensuremath\succ}% +  \DeclareUnicodeCharacter{2283}{\ensuremath\supset}% +  \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}% +  \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}% +  \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}% +  \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}% +  \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}% +  \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}% +  \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}% +  \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}% +  \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}% +  \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}% +  \DeclareUnicodeCharacter{2299}{\ensuremath\odot}% +  \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}% +  \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}% +  \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}% +  \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}% +  \DeclareUnicodeCharacter{22A8}{\ensuremath\models}% +  \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}% +  \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}% +  \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}% +  \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}% +  \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}% +  \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}% +  \DeclareUnicodeCharacter{22C6}{\ensuremath\star}% +  \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}% +  \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}% +  \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}% +  \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}% +  \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}% +  \DeclareUnicodeCharacter{2322}{\ensuremath\frown}% +  \DeclareUnicodeCharacter{2323}{\ensuremath\smile}% +  % +  \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}% +  \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}% +  \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}% +  \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}% +  \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}% +  \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}% +  \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}% +  \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}% +  \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}% +  \DeclareUnicodeCharacter{266D}{\ensuremath\flat}% +  \DeclareUnicodeCharacter{266E}{\ensuremath\natural}% +  \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}% +  \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}% +  \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}% +  \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}% +  \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}% +  \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}% +  \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}% +  \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}% +  \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}% +  \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}% +  \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}% +  \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}% +  \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}% +  \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}% +  \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}% +  \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}% +  \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}% +  \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}% +  % +  \global\mathchardef\checkmark="1370% actually the square root sign +  \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}% +}% end of \unicodechardefs + +% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command) +% It makes the setting that replace UTF-8 byte sequence.  \def\utfeightchardefs{% -  \DeclareUnicodeCharacter{00A0}{\tie} -  \DeclareUnicodeCharacter{00A1}{\exclamdown} -  \DeclareUnicodeCharacter{00A3}{\pounds} -  \DeclareUnicodeCharacter{00A8}{\"{ }} -  \DeclareUnicodeCharacter{00A9}{\copyright} -  \DeclareUnicodeCharacter{00AA}{\ordf} -  \DeclareUnicodeCharacter{00AB}{\guillemetleft} -  \DeclareUnicodeCharacter{00AD}{\-} -  \DeclareUnicodeCharacter{00AE}{\registeredsymbol} -  \DeclareUnicodeCharacter{00AF}{\={ }} - -  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} -  \DeclareUnicodeCharacter{00B4}{\'{ }} -  \DeclareUnicodeCharacter{00B8}{\cedilla{ }} -  \DeclareUnicodeCharacter{00BA}{\ordm} -  \DeclareUnicodeCharacter{00BB}{\guillemetright} -  \DeclareUnicodeCharacter{00BF}{\questiondown} - -  \DeclareUnicodeCharacter{00C0}{\`A} -  \DeclareUnicodeCharacter{00C1}{\'A} -  \DeclareUnicodeCharacter{00C2}{\^A} -  \DeclareUnicodeCharacter{00C3}{\~A} -  \DeclareUnicodeCharacter{00C4}{\"A} -  \DeclareUnicodeCharacter{00C5}{\AA} -  \DeclareUnicodeCharacter{00C6}{\AE} -  \DeclareUnicodeCharacter{00C7}{\cedilla{C}} -  \DeclareUnicodeCharacter{00C8}{\`E} -  \DeclareUnicodeCharacter{00C9}{\'E} -  \DeclareUnicodeCharacter{00CA}{\^E} -  \DeclareUnicodeCharacter{00CB}{\"E} -  \DeclareUnicodeCharacter{00CC}{\`I} -  \DeclareUnicodeCharacter{00CD}{\'I} -  \DeclareUnicodeCharacter{00CE}{\^I} -  \DeclareUnicodeCharacter{00CF}{\"I} - -  \DeclareUnicodeCharacter{00D1}{\~N} -  \DeclareUnicodeCharacter{00D2}{\`O} -  \DeclareUnicodeCharacter{00D3}{\'O} -  \DeclareUnicodeCharacter{00D4}{\^O} -  \DeclareUnicodeCharacter{00D5}{\~O} -  \DeclareUnicodeCharacter{00D6}{\"O} -  \DeclareUnicodeCharacter{00D8}{\O} -  \DeclareUnicodeCharacter{00D9}{\`U} -  \DeclareUnicodeCharacter{00DA}{\'U} -  \DeclareUnicodeCharacter{00DB}{\^U} -  \DeclareUnicodeCharacter{00DC}{\"U} -  \DeclareUnicodeCharacter{00DD}{\'Y} -  \DeclareUnicodeCharacter{00DF}{\ss} - -  \DeclareUnicodeCharacter{00E0}{\`a} -  \DeclareUnicodeCharacter{00E1}{\'a} -  \DeclareUnicodeCharacter{00E2}{\^a} -  \DeclareUnicodeCharacter{00E3}{\~a} -  \DeclareUnicodeCharacter{00E4}{\"a} -  \DeclareUnicodeCharacter{00E5}{\aa} -  \DeclareUnicodeCharacter{00E6}{\ae} -  \DeclareUnicodeCharacter{00E7}{\cedilla{c}} -  \DeclareUnicodeCharacter{00E8}{\`e} -  \DeclareUnicodeCharacter{00E9}{\'e} -  \DeclareUnicodeCharacter{00EA}{\^e} -  \DeclareUnicodeCharacter{00EB}{\"e} -  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} -  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} -  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} -  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} - -  \DeclareUnicodeCharacter{00F1}{\~n} -  \DeclareUnicodeCharacter{00F2}{\`o} -  \DeclareUnicodeCharacter{00F3}{\'o} -  \DeclareUnicodeCharacter{00F4}{\^o} -  \DeclareUnicodeCharacter{00F5}{\~o} -  \DeclareUnicodeCharacter{00F6}{\"o} -  \DeclareUnicodeCharacter{00F8}{\o} -  \DeclareUnicodeCharacter{00F9}{\`u} -  \DeclareUnicodeCharacter{00FA}{\'u} -  \DeclareUnicodeCharacter{00FB}{\^u} -  \DeclareUnicodeCharacter{00FC}{\"u} -  \DeclareUnicodeCharacter{00FD}{\'y} -  \DeclareUnicodeCharacter{00FF}{\"y} - -  \DeclareUnicodeCharacter{0100}{\=A} -  \DeclareUnicodeCharacter{0101}{\=a} -  \DeclareUnicodeCharacter{0102}{\u{A}} -  \DeclareUnicodeCharacter{0103}{\u{a}} -  \DeclareUnicodeCharacter{0106}{\'C} -  \DeclareUnicodeCharacter{0107}{\'c} -  \DeclareUnicodeCharacter{0108}{\^C} -  \DeclareUnicodeCharacter{0109}{\^c} -  \DeclareUnicodeCharacter{010A}{\dotaccent{C}} -  \DeclareUnicodeCharacter{010B}{\dotaccent{c}} -  \DeclareUnicodeCharacter{010C}{\v{C}} -  \DeclareUnicodeCharacter{010D}{\v{c}} -  \DeclareUnicodeCharacter{010E}{\v{D}} - -  \DeclareUnicodeCharacter{0112}{\=E} -  \DeclareUnicodeCharacter{0113}{\=e} -  \DeclareUnicodeCharacter{0114}{\u{E}} -  \DeclareUnicodeCharacter{0115}{\u{e}} -  \DeclareUnicodeCharacter{0116}{\dotaccent{E}} -  \DeclareUnicodeCharacter{0117}{\dotaccent{e}} -  \DeclareUnicodeCharacter{011A}{\v{E}} -  \DeclareUnicodeCharacter{011B}{\v{e}} -  \DeclareUnicodeCharacter{011C}{\^G} -  \DeclareUnicodeCharacter{011D}{\^g} -  \DeclareUnicodeCharacter{011E}{\u{G}} -  \DeclareUnicodeCharacter{011F}{\u{g}} - -  \DeclareUnicodeCharacter{0120}{\dotaccent{G}} -  \DeclareUnicodeCharacter{0121}{\dotaccent{g}} -  \DeclareUnicodeCharacter{0124}{\^H} -  \DeclareUnicodeCharacter{0125}{\^h} -  \DeclareUnicodeCharacter{0128}{\~I} -  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} -  \DeclareUnicodeCharacter{012A}{\=I} -  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} -  \DeclareUnicodeCharacter{012C}{\u{I}} -  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} - -  \DeclareUnicodeCharacter{0130}{\dotaccent{I}} -  \DeclareUnicodeCharacter{0131}{\dotless{i}} -  \DeclareUnicodeCharacter{0132}{IJ} -  \DeclareUnicodeCharacter{0133}{ij} -  \DeclareUnicodeCharacter{0134}{\^J} -  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} -  \DeclareUnicodeCharacter{0139}{\'L} -  \DeclareUnicodeCharacter{013A}{\'l} - -  \DeclareUnicodeCharacter{0141}{\L} -  \DeclareUnicodeCharacter{0142}{\l} -  \DeclareUnicodeCharacter{0143}{\'N} -  \DeclareUnicodeCharacter{0144}{\'n} -  \DeclareUnicodeCharacter{0147}{\v{N}} -  \DeclareUnicodeCharacter{0148}{\v{n}} -  \DeclareUnicodeCharacter{014C}{\=O} -  \DeclareUnicodeCharacter{014D}{\=o} -  \DeclareUnicodeCharacter{014E}{\u{O}} -  \DeclareUnicodeCharacter{014F}{\u{o}} - -  \DeclareUnicodeCharacter{0150}{\H{O}} -  \DeclareUnicodeCharacter{0151}{\H{o}} -  \DeclareUnicodeCharacter{0152}{\OE} -  \DeclareUnicodeCharacter{0153}{\oe} -  \DeclareUnicodeCharacter{0154}{\'R} -  \DeclareUnicodeCharacter{0155}{\'r} -  \DeclareUnicodeCharacter{0158}{\v{R}} -  \DeclareUnicodeCharacter{0159}{\v{r}} -  \DeclareUnicodeCharacter{015A}{\'S} -  \DeclareUnicodeCharacter{015B}{\'s} -  \DeclareUnicodeCharacter{015C}{\^S} -  \DeclareUnicodeCharacter{015D}{\^s} -  \DeclareUnicodeCharacter{015E}{\cedilla{S}} -  \DeclareUnicodeCharacter{015F}{\cedilla{s}} - -  \DeclareUnicodeCharacter{0160}{\v{S}} -  \DeclareUnicodeCharacter{0161}{\v{s}} -  \DeclareUnicodeCharacter{0162}{\cedilla{t}} -  \DeclareUnicodeCharacter{0163}{\cedilla{T}} -  \DeclareUnicodeCharacter{0164}{\v{T}} - -  \DeclareUnicodeCharacter{0168}{\~U} -  \DeclareUnicodeCharacter{0169}{\~u} -  \DeclareUnicodeCharacter{016A}{\=U} -  \DeclareUnicodeCharacter{016B}{\=u} -  \DeclareUnicodeCharacter{016C}{\u{U}} -  \DeclareUnicodeCharacter{016D}{\u{u}} -  \DeclareUnicodeCharacter{016E}{\ringaccent{U}} -  \DeclareUnicodeCharacter{016F}{\ringaccent{u}} - -  \DeclareUnicodeCharacter{0170}{\H{U}} -  \DeclareUnicodeCharacter{0171}{\H{u}} -  \DeclareUnicodeCharacter{0174}{\^W} -  \DeclareUnicodeCharacter{0175}{\^w} -  \DeclareUnicodeCharacter{0176}{\^Y} -  \DeclareUnicodeCharacter{0177}{\^y} -  \DeclareUnicodeCharacter{0178}{\"Y} -  \DeclareUnicodeCharacter{0179}{\'Z} -  \DeclareUnicodeCharacter{017A}{\'z} -  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} -  \DeclareUnicodeCharacter{017C}{\dotaccent{z}} -  \DeclareUnicodeCharacter{017D}{\v{Z}} -  \DeclareUnicodeCharacter{017E}{\v{z}} - -  \DeclareUnicodeCharacter{01C4}{D\v{Z}} -  \DeclareUnicodeCharacter{01C5}{D\v{z}} -  \DeclareUnicodeCharacter{01C6}{d\v{z}} -  \DeclareUnicodeCharacter{01C7}{LJ} -  \DeclareUnicodeCharacter{01C8}{Lj} -  \DeclareUnicodeCharacter{01C9}{lj} -  \DeclareUnicodeCharacter{01CA}{NJ} -  \DeclareUnicodeCharacter{01CB}{Nj} -  \DeclareUnicodeCharacter{01CC}{nj} -  \DeclareUnicodeCharacter{01CD}{\v{A}} -  \DeclareUnicodeCharacter{01CE}{\v{a}} -  \DeclareUnicodeCharacter{01CF}{\v{I}} - -  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} -  \DeclareUnicodeCharacter{01D1}{\v{O}} -  \DeclareUnicodeCharacter{01D2}{\v{o}} -  \DeclareUnicodeCharacter{01D3}{\v{U}} -  \DeclareUnicodeCharacter{01D4}{\v{u}} - -  \DeclareUnicodeCharacter{01E2}{\={\AE}} -  \DeclareUnicodeCharacter{01E3}{\={\ae}} -  \DeclareUnicodeCharacter{01E6}{\v{G}} -  \DeclareUnicodeCharacter{01E7}{\v{g}} -  \DeclareUnicodeCharacter{01E8}{\v{K}} -  \DeclareUnicodeCharacter{01E9}{\v{k}} - -  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} -  \DeclareUnicodeCharacter{01F1}{DZ} -  \DeclareUnicodeCharacter{01F2}{Dz} -  \DeclareUnicodeCharacter{01F3}{dz} -  \DeclareUnicodeCharacter{01F4}{\'G} -  \DeclareUnicodeCharacter{01F5}{\'g} -  \DeclareUnicodeCharacter{01F8}{\`N} -  \DeclareUnicodeCharacter{01F9}{\`n} -  \DeclareUnicodeCharacter{01FC}{\'{\AE}} -  \DeclareUnicodeCharacter{01FD}{\'{\ae}} -  \DeclareUnicodeCharacter{01FE}{\'{\O}} -  \DeclareUnicodeCharacter{01FF}{\'{\o}} - -  \DeclareUnicodeCharacter{021E}{\v{H}} -  \DeclareUnicodeCharacter{021F}{\v{h}} - -  \DeclareUnicodeCharacter{0226}{\dotaccent{A}} -  \DeclareUnicodeCharacter{0227}{\dotaccent{a}} -  \DeclareUnicodeCharacter{0228}{\cedilla{E}} -  \DeclareUnicodeCharacter{0229}{\cedilla{e}} -  \DeclareUnicodeCharacter{022E}{\dotaccent{O}} -  \DeclareUnicodeCharacter{022F}{\dotaccent{o}} - -  \DeclareUnicodeCharacter{0232}{\=Y} -  \DeclareUnicodeCharacter{0233}{\=y} -  \DeclareUnicodeCharacter{0237}{\dotless{j}} - -  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} -  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} -  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} -  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} -  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} -  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} -  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} -  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} -  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} -  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} -  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} -  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} - -  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} -  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} - -  \DeclareUnicodeCharacter{1E20}{\=G} -  \DeclareUnicodeCharacter{1E21}{\=g} -  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} -  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} -  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} -  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} -  \DeclareUnicodeCharacter{1E26}{\"H} -  \DeclareUnicodeCharacter{1E27}{\"h} - -  \DeclareUnicodeCharacter{1E30}{\'K} -  \DeclareUnicodeCharacter{1E31}{\'k} -  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} -  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} -  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} -  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} -  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} -  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} -  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} -  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} -  \DeclareUnicodeCharacter{1E3E}{\'M} -  \DeclareUnicodeCharacter{1E3F}{\'m} - -  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} -  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} -  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} -  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} -  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} -  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} -  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} -  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} -  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} -  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} - -  \DeclareUnicodeCharacter{1E54}{\'P} -  \DeclareUnicodeCharacter{1E55}{\'p} -  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} -  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} -  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} -  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} -  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} -  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} -  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} -  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} - -  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} -  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} -  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} -  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} -  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} -  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} -  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} -  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} -  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} -  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} - -  \DeclareUnicodeCharacter{1E7C}{\~V} -  \DeclareUnicodeCharacter{1E7D}{\~v} -  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} -  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} - -  \DeclareUnicodeCharacter{1E80}{\`W} -  \DeclareUnicodeCharacter{1E81}{\`w} -  \DeclareUnicodeCharacter{1E82}{\'W} -  \DeclareUnicodeCharacter{1E83}{\'w} -  \DeclareUnicodeCharacter{1E84}{\"W} -  \DeclareUnicodeCharacter{1E85}{\"w} -  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} -  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} -  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} -  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} -  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} -  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} -  \DeclareUnicodeCharacter{1E8C}{\"X} -  \DeclareUnicodeCharacter{1E8D}{\"x} -  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} -  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} - -  \DeclareUnicodeCharacter{1E90}{\^Z} -  \DeclareUnicodeCharacter{1E91}{\^z} -  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} -  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} -  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} -  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} -  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} -  \DeclareUnicodeCharacter{1E97}{\"t} -  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} -  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} - -  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} -  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} - -  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} -  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} -  \DeclareUnicodeCharacter{1EBC}{\~E} -  \DeclareUnicodeCharacter{1EBD}{\~e} - -  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} -  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} -  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} -  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} - -  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} -  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} - -  \DeclareUnicodeCharacter{1EF2}{\`Y} -  \DeclareUnicodeCharacter{1EF3}{\`y} -  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} - -  \DeclareUnicodeCharacter{1EF8}{\~Y} -  \DeclareUnicodeCharacter{1EF9}{\~y} - -  \DeclareUnicodeCharacter{2013}{--} -  \DeclareUnicodeCharacter{2014}{---} -  \DeclareUnicodeCharacter{2018}{\quoteleft} -  \DeclareUnicodeCharacter{2019}{\quoteright} -  \DeclareUnicodeCharacter{201A}{\quotesinglbase} -  \DeclareUnicodeCharacter{201C}{\quotedblleft} -  \DeclareUnicodeCharacter{201D}{\quotedblright} -  \DeclareUnicodeCharacter{201E}{\quotedblbase} -  \DeclareUnicodeCharacter{2022}{\bullet} -  \DeclareUnicodeCharacter{2026}{\dots} -  \DeclareUnicodeCharacter{2039}{\guilsinglleft} -  \DeclareUnicodeCharacter{203A}{\guilsinglright} -  \DeclareUnicodeCharacter{20AC}{\euro} - -  \DeclareUnicodeCharacter{2192}{\expansion} -  \DeclareUnicodeCharacter{21D2}{\result} - -  \DeclareUnicodeCharacter{2212}{\minus} -  \DeclareUnicodeCharacter{2217}{\point} -  \DeclareUnicodeCharacter{2261}{\equiv} -}% end of \utfeightchardefs +  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii +  \unicodechardefs +} +% Whether the active definitions of non-ASCII characters expand to +% non-active tokens with the same character code.  This is used to +% write characters literally, instead of using active definitions for +% printing the correct glyphs. +\newif\ifpassthroughchars +\passthroughcharsfalse + +% For native Unicode handling (XeTeX and LuaTeX), +% provide a definition macro to replace/pass-through a Unicode character +% +\def\DeclareUnicodeCharacterNative#1#2{% +  \catcode"#1=\active +  \def\dodeclareunicodecharacternative##1##2##3{% +    \begingroup +      \uccode`\~="##2\relax +      \uppercase{\gdef~}{% +        \ifpassthroughchars +          ##1% +        \else +          ##3% +        \fi +      } +    \endgroup +  } +  \begingroup +    \uccode`\.="#1\relax +    \uppercase{\def\UTFNativeTmp{.}}% +    \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% +  \endgroup +} + +% Native Unicode handling (XeTeX and LuaTeX) character replacing definition. +% It activates the setting that replaces Unicode characters. +\def\nativeunicodechardefs{% +  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative +  \unicodechardefs +} + +% For native Unicode handling (XeTeX and LuaTeX), +% make the character token expand +% to the sequences given in \unicodechardefs for printing. +\def\DeclareUnicodeCharacterNativeAtU#1#2{% +  \def\UTFAtUTmp{#2} +  \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp +} + +% @U command definitions for native Unicode handling (XeTeX and LuaTeX). +\def\nativeunicodechardefsatu{% +  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU +  \unicodechardefs +}  % US-ASCII character definitions.  \def\asciichardefs{% nothing need be done     \relax  } +% define all Unicode characters we know about, for the sake of @U. +\iftxinativeunicodecapable +  \nativeunicodechardefsatu +\else +  \utfeightchardefs +\fi + +  % Make non-ASCII characters printable again for compatibility with  % existing Texinfo documents that may use them, even without declaring a  % document encoding. @@ -8618,8 +11230,8 @@ should work if nowhere else does.}  % Prevent underfull vbox error messages.  \vbadness = 10000 -% Don't be so finicky about underfull hboxes, either. -\hbadness = 2000 +% Don't be very finicky about underfull hboxes, either. +\hbadness = 6666  % Following George Bush, get rid of widows and orphans.  \widowpenalty=10000 @@ -8655,12 +11267,12 @@ should work if nowhere else does.}    \advance\vsize by \topskip    \outervsize = \vsize    \advance\outervsize by 2\topandbottommargin -  \pageheight = \vsize +  \txipageheight = \vsize    %    \hsize = #2\relax    \outerhsize = \hsize    \advance\outerhsize by 0.5in -  \pagewidth = \hsize +  \txipagewidth = \hsize    %    \normaloffset = #4\relax    \bindingoffset = #5\relax @@ -8672,6 +11284,14 @@ should work if nowhere else does.}      % whatever layout pdftex was dumped with.      \pdfhorigin = 1 true in      \pdfvorigin = 1 true in +  \else +    \ifx\XeTeXrevision\thisisundefined +      \special{papersize=#8,#7}% +    \else +      \pdfpageheight #7\relax +      \pdfpagewidth #8\relax +      % XeTeX does not have \pdfhorigin and \pdfvorigin. +    \fi    \fi    %    \setleading{\textleading} @@ -8704,7 +11324,6 @@ should work if nowhere else does.}    %    \lispnarrowing = 0.3in    \tolerance = 700 -  \hfuzz = 1pt    \contentsrightmargin = 0pt    \defbodyindent = .5cm  }} @@ -8722,7 +11341,6 @@ should work if nowhere else does.}    %    \lispnarrowing = 0.25in    \tolerance = 700 -  \hfuzz = 1pt    \contentsrightmargin = 0pt    \defbodyindent = .4cm  }} @@ -8748,7 +11366,6 @@ should work if nowhere else does.}                      {297mm}{210mm}%    %    \tolerance = 700 -  \hfuzz = 1pt    \contentsrightmargin = 0pt    \defbodyindent = 5mm  }} @@ -8767,7 +11384,6 @@ should work if nowhere else does.}    %    \lispnarrowing = 0.2in    \tolerance = 800 -  \hfuzz = 1.2pt    \contentsrightmargin = 0pt    \defbodyindent = 2mm    \tableindent = 12mm @@ -8823,28 +11439,27 @@ should work if nowhere else does.}  %  \letterpaper +% Default value of \hfuzz, for suppressing warnings about overfull hboxes. +\hfuzz = 1pt +  \message{and turning on texinfo input format.} +\def^^L{\par} % remove \outer, so ^L can appear in an @comment + +% DEL is a comment character, in case @c does not suffice. +\catcode`\^^? = 14 +  % Define macros to output various characters with catcode for normal text. -\catcode`\"=\other -\catcode`\~=\other -\catcode`\^=\other -\catcode`\_=\other -\catcode`\|=\other -\catcode`\<=\other -\catcode`\>=\other -\catcode`\+=\other -\catcode`\$=\other -\def\normaldoublequote{"} -\def\normaltilde{~} -\def\normalcaret{^} -\def\normalunderscore{_} -\def\normalverticalbar{|} -\def\normalless{<} -\def\normalgreater{>} -\def\normalplus{+} -\def\normaldollar{$}%$ font-lock fix +\catcode`\"=\other \def\normaldoublequote{"} +\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix +\catcode`\+=\other \def\normalplus{+} +\catcode`\<=\other \def\normalless{<} +\catcode`\>=\other \def\normalgreater{>} +\catcode`\^=\other \def\normalcaret{^} +\catcode`\_=\other \def\normalunderscore{_} +\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, @@ -8863,44 +11478,47 @@ should work if nowhere else does.}  % this is not a problem.  \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} -% Turn off all special characters except @ -% (and those which the user can use as if they were ordinary). +% Set catcodes for Texinfo file + +% Active characters for printing the wanted glyph.  % Most of these we simply print from the \tt font, but for some, we can  % use math or other variants that look better in normal text. - +%  \catcode`\"=\active  \def\activedoublequote{{\tt\char34}}  \let"=\activedoublequote -\catcode`\~=\active -\def~{{\tt\char126}} -\chardef\hat=`\^ -\catcode`\^=\active -\def^{{\tt \hat}} +\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde +\chardef\hatchar=`\^ +\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat  \catcode`\_=\active  \def_{\ifusingtt\normalunderscore\_} -\let\realunder=_ -% Subroutine for the previous macro.  \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } +\let\realunder=_ + +\catcode`\|=\active \def|{{\tt\char124}} -\catcode`\|=\active -\def|{{\tt\char124}}  \chardef \less=`\< -\catcode`\<=\active -\def<{{\tt \less}} +\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless  \chardef \gtr=`\> -\catcode`\>=\active -\def>{{\tt \gtr}} -\catcode`\+=\active -\def+{{\tt \char 43}} -\catcode`\$=\active -\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr +\catcode`\+=\active \def+{{\tt \char 43}} +\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix +\catcode`\-=\active \let-=\normaldash -% 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 \everyjob (or @setfilename) turn them on. -% \otherifyactive is called near the end of this file. -\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +% used for headline/footline in the output routine, in case the page +% breaks in the middle of an @tex block. +\def\texinfochars{% +  \let< = \activeless +  \let> = \activegtr +  \let~ = \activetilde  +  \let^ = \activehat +  \markupsetuplqdefault \markupsetuprqdefault  +  \let\b = \strong +  \let\i = \smartitalic +  % in principle, all other definitions in \tex have to be undone too. +}  % Used sometimes to turn off (effectively) the active characters even after  % parsing them. @@ -8920,71 +11538,145 @@ should work if nowhere else does.}  % \doublebackslash is two of them (for the pdf outlines).  {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} -% In texinfo, backslash is an active character; it prints the backslash +% In Texinfo, backslash is an active character; it prints the backslash  % in fixed width font. -\catcode`\\=\active -@def@normalbackslash{{@tt@backslashcurfont}} -% On startup, @fixbackslash assigns: -%  @let \ = @normalbackslash +\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 +% font (because \char in math mode uses the \mathcode, and plain.tex +% sets \mathcode`\\="026E).  Hence we use an explicit \mathchar, +% which is the decimal equivalent of "715c (class 7, e.g., use \fam; +% 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.  % \rawbackslash defines an active \ to do \backslashcurfont.  % \otherbackslash defines an active \ to be a literal `\' character with -% catcode other. +% catcode other.  We switch back and forth between these.  @gdef@rawbackslash{@let\=@backslashcurfont}  @gdef@otherbackslash{@let\=@realbackslash}  % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of  % the literal character `\'. -%  -@def@normalturnoffactive{% -  @let\=@normalbackslash -  @let"=@normaldoublequote -  @let~=@normaltilde -  @let^=@normalcaret -  @let_=@normalunderscore -  @let|=@normalverticalbar -  @let<=@normalless -  @let>=@normalgreater -  @let+=@normalplus -  @let$=@normaldollar %$ font-lock fix -  @unsepspaces -} - -% Make _ and + \other characters, temporarily. -% This is canceled by @fixbackslash. -@otherifyactive +% +{@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. -% -@gdef@eatinput input texinfo{@fixbackslash} -@global@let\ = @eatinput +% 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% +    %<warning: active newline>@par% +}}} + -% On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\' in the file would cause an error. This macro tries to fix -% that, assuming it is called before the first `\' could plausibly occur. -% Also turn back on active characters that might appear in the input -% file name, in case not using a pre-dumped format. -%  @gdef@fixbackslash{% -  @ifx\@eatinput @let\ = @normalbackslash @fi +  @ifx\@eatinput @let\ = @ttbackslash @fi +  @catcode13=5 % regular end of line +  @enableemergencynewline +  @let@c=@texinfoc +  @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 +  % +  % 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  } +  % Say @foo, not \foo, in error messages.  @escapechar = `@@ -% These look ok in all fonts, so just make them not special. -@catcode`@& = @other -@catcode`@# = @other -@catcode`@% = @other +% 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{&} +@catcode`@# = @other @def@normalhash{#} +@catcode`@% = @other @def@normalpercent{%} + +@let @hashchar = @normalhash + +@c Finally, make ` and ' active, so that txicodequoteundirected and +@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we +@c don't make ` and ' active, @code will not get them as active chars. +@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 'write-file-hooks 'time-stamp) -@c page-delimiter: "^\\\\message" +@c page-delimiter: "^\\\\message\\|emacs-page"  @c time-stamp-start: "def\\\\texinfoversion{"  @c time-stamp-format: "%:y-%02m-%02d.%02H"  @c time-stamp-end: "}" @@ -8992,6 +11684,4 @@ should work if nowhere else does.}  @c vim:sw=2: -@ignore -   arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 -@end ignore +@enablebackslashhack | 
