|
|
|
|
@@ -3,7 +3,7 @@
|
|
|
|
|
% Load plain if necessary, i.e., if running under initex.
|
|
|
|
|
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
|
|
|
|
|
%
|
|
|
|
|
\def\texinfoversion{2023-01-02.21}
|
|
|
|
|
\def\texinfoversion{2023-03-04.12}
|
|
|
|
|
%
|
|
|
|
|
% Copyright 1985, 1986, 1988, 1990-2023 Free Software Foundation, Inc.
|
|
|
|
|
%
|
|
|
|
|
@@ -2683,25 +2683,21 @@ end
|
|
|
|
|
}
|
|
|
|
|
\setregularquotes
|
|
|
|
|
|
|
|
|
|
% 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.
|
|
|
|
|
% output for ' in @code
|
|
|
|
|
% in tt font hex 0D (undirected) or 27 (curly right quote)
|
|
|
|
|
%
|
|
|
|
|
\def\codequoteright{%
|
|
|
|
|
\ifusingtt
|
|
|
|
|
{\ifflagclear{txicodequoteundirected}%
|
|
|
|
|
{\ifflagclear{codequoteundirected}%
|
|
|
|
|
{'}%
|
|
|
|
|
{\char'15 }}%
|
|
|
|
|
{\char'15 }}%
|
|
|
|
|
{\char"0D }}%
|
|
|
|
|
{\char"0D }}%
|
|
|
|
|
{'}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% 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.
|
|
|
|
|
% output for ` in @code
|
|
|
|
|
% in tt font hex 12 (grave accent) or 60 (curly left quote)
|
|
|
|
|
% \relax disables Spanish ligatures ?` and !` of \tt font.
|
|
|
|
|
%
|
|
|
|
|
\def\codequoteleft{%
|
|
|
|
|
@@ -2709,8 +2705,8 @@ end
|
|
|
|
|
{\ifflagclear{txicodequotebacktick}%
|
|
|
|
|
{\ifflagclear{codequotebacktick}%
|
|
|
|
|
{\relax`}%
|
|
|
|
|
{\char'22 }}%
|
|
|
|
|
{\char'22 }}%
|
|
|
|
|
{\char"12 }}%
|
|
|
|
|
{\char"12 }}%
|
|
|
|
|
{\relax`}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2729,7 +2725,7 @@ end
|
|
|
|
|
\errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
|
|
|
|
|
\fi\fi
|
|
|
|
|
}
|
|
|
|
|
%
|
|
|
|
|
|
|
|
|
|
\parseargdef\codequotebacktick{%
|
|
|
|
|
\def\temp{#1}%
|
|
|
|
|
\ifx\temp\onword
|
|
|
|
|
@@ -2744,6 +2740,11 @@ end
|
|
|
|
|
\fi\fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% Turn them on by default
|
|
|
|
|
\let\SETtxicodequoteundirected = t
|
|
|
|
|
\let\SETtxicodequotebacktick = t
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
|
|
|
|
|
\def\noligaturesquoteleft{\relax\lq}
|
|
|
|
|
|
|
|
|
|
@@ -2929,10 +2930,6 @@ end
|
|
|
|
|
\let-\dashnobreak
|
|
|
|
|
\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
|
|
|
|
|
}
|
|
|
|
|
%
|
|
|
|
|
@@ -2942,21 +2939,30 @@ end
|
|
|
|
|
%
|
|
|
|
|
% Now, output a discretionary to allow a line break, unless
|
|
|
|
|
% (a) the next character is a -, or
|
|
|
|
|
% (b) the preceding character is a -.
|
|
|
|
|
% (b) the preceding character is a -, or
|
|
|
|
|
% (c) we are at the start of the string.
|
|
|
|
|
% In both cases (b) and (c), \codedashnobreak should be set to \codedash.
|
|
|
|
|
%
|
|
|
|
|
% E.g., given --posix, we do not want to allow a break after either -.
|
|
|
|
|
% Given --foo-bar, we do want to allow a break between the - and the b.
|
|
|
|
|
\ifx\next\codedash \else
|
|
|
|
|
\ifx\codedashprev\codedash
|
|
|
|
|
\ifx\codedashnobreak\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
|
|
|
|
|
\global\let\codedashnobreak= \next
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
\def\normaldash{-}
|
|
|
|
|
%
|
|
|
|
|
\def\codex #1{\tclose{#1}\endgroup}
|
|
|
|
|
\def\codex #1{\tclose{%
|
|
|
|
|
% Given -foo (with a single dash), we do not want to allow a break
|
|
|
|
|
% after the -. \codedashnobreak is set to the first character in
|
|
|
|
|
% @code.
|
|
|
|
|
\futurelet\codedashnobreak\relax
|
|
|
|
|
#1%
|
|
|
|
|
}\endgroup}
|
|
|
|
|
|
|
|
|
|
\def\codeunder{%
|
|
|
|
|
% this is all so @math{@code{var_name}+1} can work. In math mode, _
|
|
|
|
|
@@ -3950,33 +3956,23 @@ $$%
|
|
|
|
|
|
|
|
|
|
\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
|
|
|
|
|
|
|
|
|
|
% When we turn headings on, set the page number to 1.
|
|
|
|
|
% Set the page number to 1.
|
|
|
|
|
\def\pageone{
|
|
|
|
|
\global\pageno=1
|
|
|
|
|
\global\arabiccount = \pagecount
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
\let\contentsalignmacro = \chappager
|
|
|
|
|
|
|
|
|
|
% \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon
|
|
|
|
|
|
|
|
|
|
% For double-sided printing, put current file name in lower left corner,
|
|
|
|
|
% chapter name on inside top of right hand pages, document
|
|
|
|
|
% title on inside top of left hand pages, and page numbers on outside top
|
|
|
|
|
% edge of all pages.
|
|
|
|
|
\def\HEADINGSdouble{%
|
|
|
|
|
\pageone
|
|
|
|
|
\HEADINGSdoublex
|
|
|
|
|
}
|
|
|
|
|
\let\contentsalignmacro = \chappager
|
|
|
|
|
|
|
|
|
|
% For single-sided printing, chapter title goes across top left of page,
|
|
|
|
|
% page number on top right.
|
|
|
|
|
\def\HEADINGSsingle{%
|
|
|
|
|
\pageone
|
|
|
|
|
\HEADINGSsinglex
|
|
|
|
|
}
|
|
|
|
|
% \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon
|
|
|
|
|
|
|
|
|
|
\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
|
|
|
|
|
\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble}
|
|
|
|
|
\let\HEADINGSdoubleafter=\HEADINGSafter
|
|
|
|
|
\def\HEADINGSdoublex{%
|
|
|
|
|
\def\HEADINGSdouble{%
|
|
|
|
|
\global\evenfootline={\hfil}
|
|
|
|
|
\global\oddfootline={\hfil}
|
|
|
|
|
\global\evenheadline={\line{\folio\hfil\thistitle}}
|
|
|
|
|
@@ -3986,8 +3982,10 @@ $$%
|
|
|
|
|
\global\let\contentsalignmacro = \chapoddpage
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
|
|
|
|
|
\def\HEADINGSsinglex{%
|
|
|
|
|
% For single-sided printing, chapter title goes across top left of page,
|
|
|
|
|
% page number on top right.
|
|
|
|
|
\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle}
|
|
|
|
|
\def\HEADINGSsingle{%
|
|
|
|
|
\global\evenfootline={\hfil}
|
|
|
|
|
\global\oddfootline={\hfil}
|
|
|
|
|
\global\evenheadline={\line{\thischapter\hfil\folio}}
|
|
|
|
|
@@ -3999,7 +3997,6 @@ $$%
|
|
|
|
|
|
|
|
|
|
% for @setchapternewpage off
|
|
|
|
|
\def\HEADINGSsinglechapoff{%
|
|
|
|
|
\pageone
|
|
|
|
|
\global\evenfootline={\hfil}
|
|
|
|
|
\global\oddfootline={\hfil}
|
|
|
|
|
\global\evenheadline={\line{\thischapter\hfil\folio}}
|
|
|
|
|
@@ -4105,6 +4102,7 @@ $$%
|
|
|
|
|
\nobreak\kern\dimen0
|
|
|
|
|
\endgroup
|
|
|
|
|
\itemxneedsnegativevskiptrue
|
|
|
|
|
\penalty 10021 % for \indexpar
|
|
|
|
|
\fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -4221,6 +4219,7 @@ $$%
|
|
|
|
|
% We can be in inner vertical mode in a footnote, although an
|
|
|
|
|
% @itemize looks awful there.
|
|
|
|
|
}%
|
|
|
|
|
\penalty 10021 % for \indexpar
|
|
|
|
|
\flushcr
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -4725,13 +4724,11 @@ $$%
|
|
|
|
|
% except not \outer, so it can be used within macros and \if's.
|
|
|
|
|
\edef\newwrite{\makecsname{ptexnewwrite}}
|
|
|
|
|
|
|
|
|
|
% \newindex {foo} defines an index named IX.
|
|
|
|
|
% \newindex {IX} defines an index named IX.
|
|
|
|
|
% It automatically defines \IXindex such that
|
|
|
|
|
% \IXindex ...rest of line... puts an entry in the index IX.
|
|
|
|
|
% It also defines \IXindfile to be the number of the output channel for
|
|
|
|
|
% the file that accumulates this index. The file's extension is IX.
|
|
|
|
|
% The name of an index should be no more than 2 characters long
|
|
|
|
|
% for the sake of vms.
|
|
|
|
|
%
|
|
|
|
|
\def\newindex#1{%
|
|
|
|
|
\expandafter\chardef\csname#1indfile\endcsname=0
|
|
|
|
|
@@ -4787,11 +4784,17 @@ $$%
|
|
|
|
|
% and it is the two-letter name of the index.
|
|
|
|
|
|
|
|
|
|
\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
|
|
|
|
|
\def\doindexxxx #1{\doind{\indexname}{#1}}
|
|
|
|
|
\def\doindexxxx #1{\indexpar\doind{\indexname}{#1}}
|
|
|
|
|
|
|
|
|
|
% like the previous two, but they put @code around the argument.
|
|
|
|
|
\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
|
|
|
|
|
\def\docodeindexxxx #1{\docind{\indexname}{#1}}
|
|
|
|
|
\def\docodeindexxxx #1{\indexpar\docind{\indexname}{#1}}
|
|
|
|
|
|
|
|
|
|
% End any open paragraph, unless we are immediately after @item in
|
|
|
|
|
% @itemize or @enumerate.
|
|
|
|
|
\def\indexpar{%
|
|
|
|
|
\ifnum\lastpenalty=10021 \else\endgraf\fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% \definedummyword defines \#1 as \string\#1\space, thus effectively
|
|
|
|
|
@@ -4989,7 +4992,7 @@ $$%
|
|
|
|
|
\commondummyword\ampchar {\normalamp}%
|
|
|
|
|
\commondummyword\atchar {\@}%
|
|
|
|
|
\commondummyword\arrow {->}%
|
|
|
|
|
\commondummyword\backslashchar {}%
|
|
|
|
|
\commondummyword\backslashchar {\realbackslash}%
|
|
|
|
|
\commondummyword\bullet {bullet}%
|
|
|
|
|
\commondummyword\comma {,}%
|
|
|
|
|
\commondummyword\copyright {copyright}%
|
|
|
|
|
@@ -5089,9 +5092,6 @@ $$%
|
|
|
|
|
%
|
|
|
|
|
% 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
|
|
|
|
|
@@ -5351,7 +5351,9 @@ $$%
|
|
|
|
|
% ..., ready, GO:
|
|
|
|
|
%
|
|
|
|
|
\def\safewhatsit#1{\ifhmode
|
|
|
|
|
\whatsitpenalty = \lastpenalty
|
|
|
|
|
#1%
|
|
|
|
|
\ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
|
|
|
|
|
\else
|
|
|
|
|
% \lastskip and \lastpenalty cannot both be nonzero simultaneously.
|
|
|
|
|
\whatsitskip = \lastskip
|
|
|
|
|
@@ -7387,6 +7389,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
\def\setupverb{%
|
|
|
|
|
\tt
|
|
|
|
|
\def\par{\leavevmode\endgraf}%
|
|
|
|
|
\parindent = 0pt
|
|
|
|
|
\setcodequotes
|
|
|
|
|
\tabeightspaces
|
|
|
|
|
% Respect line breaks,
|
|
|
|
|
@@ -7562,11 +7565,6 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
\exdentamount=\defbodyindent
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
\newtoks\defidx
|
|
|
|
|
\newtoks\deftext
|
|
|
|
|
|
|
|
|
|
\def\useindex#1{\defidx={#1}\ignorespaces}
|
|
|
|
|
|
|
|
|
|
% Called as \printdefunline \deffooheader{text}
|
|
|
|
|
%
|
|
|
|
|
\def\printdefunline#1#2{%
|
|
|
|
|
@@ -7574,10 +7572,6 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
\plainfrenchspacing
|
|
|
|
|
% call \deffooheader:
|
|
|
|
|
#1#2 \endheader
|
|
|
|
|
% create the index entry
|
|
|
|
|
\defcharsdefault
|
|
|
|
|
\edef\temp{\noexpand\doind{\the\defidx}{\the\deftext}}%
|
|
|
|
|
\temp
|
|
|
|
|
% common ending:
|
|
|
|
|
\interlinepenalty = 10000
|
|
|
|
|
\advance\rightskip by 0pt plus 1fil\relax
|
|
|
|
|
@@ -7592,6 +7586,24 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
|
|
|
|
|
\def\Edefun{\endgraf\medbreak}
|
|
|
|
|
|
|
|
|
|
% @defblock, @defline do not automatically create index entries
|
|
|
|
|
\envdef\defblock{%
|
|
|
|
|
\startdefun
|
|
|
|
|
}
|
|
|
|
|
\let\Edefblock\Edefun
|
|
|
|
|
|
|
|
|
|
\def\defline{%
|
|
|
|
|
\doingtypefnfalse
|
|
|
|
|
\parseargusing\activeparens{\printdefunline\deflineheader}%
|
|
|
|
|
}
|
|
|
|
|
\def\deflineheader#1 #2 #3\endheader{%
|
|
|
|
|
\defname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
|
|
|
|
|
}
|
|
|
|
|
\def\deftypeline{%
|
|
|
|
|
\doingtypefntrue
|
|
|
|
|
\parseargusing\activeparens{\printdefunline\deflineheader}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% \makedefun{deffoo} (\deffooheader parameters) { (\deffooheader expansion) }
|
|
|
|
|
%
|
|
|
|
|
% Define \deffoo, \deffoox \Edeffoo and \deffooheader.
|
|
|
|
|
@@ -7643,23 +7655,18 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
\fi\fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
\def\defind#1#2{
|
|
|
|
|
\defidx={#1}%
|
|
|
|
|
\deftext={#2}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% Untyped functions:
|
|
|
|
|
|
|
|
|
|
% @deffn category name args
|
|
|
|
|
\makedefun{deffn}#1 #2 #3\endheader{%
|
|
|
|
|
\defind{fn}{\code{#2}}%
|
|
|
|
|
\doind{fn}{\code{#2}}%
|
|
|
|
|
\defname{#1}{}{#2}\magicamp\defunargs{#3\unskip}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% @defop category class name args
|
|
|
|
|
\makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}}
|
|
|
|
|
\def\defopheaderx#1#2 #3 #4\endheader{%
|
|
|
|
|
\defind{fn}{\code{#3}\space\putwordon\ \code{#2}}%
|
|
|
|
|
\doind{fn}{\code{#3}\space\putwordon\ \code{#2}}%
|
|
|
|
|
\defname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -7667,7 +7674,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
|
|
|
|
|
% @deftypefn category type name args
|
|
|
|
|
\makedefun{deftypefn}#1 #2 #3 #4\endheader{%
|
|
|
|
|
\defind{fn}{\code{#3}}%
|
|
|
|
|
\doind{fn}{\code{#3}}%
|
|
|
|
|
\doingtypefntrue
|
|
|
|
|
\defname{#1}{#2}{#3}\defunargs{#4\unskip}%
|
|
|
|
|
}
|
|
|
|
|
@@ -7675,7 +7682,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
% @deftypeop category class type name args
|
|
|
|
|
\makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}}
|
|
|
|
|
\def\deftypeopheaderx#1#2 #3 #4 #5\endheader{%
|
|
|
|
|
\defind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}%
|
|
|
|
|
\doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}%
|
|
|
|
|
\doingtypefntrue
|
|
|
|
|
\defname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
|
|
|
|
|
}
|
|
|
|
|
@@ -7684,14 +7691,14 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
|
|
|
|
|
% @deftypevr category type var args
|
|
|
|
|
\makedefun{deftypevr}#1 #2 #3 #4\endheader{%
|
|
|
|
|
\defind{vr}{\code{#3}}%
|
|
|
|
|
\doind{vr}{\code{#3}}%
|
|
|
|
|
\defname{#1}{#2}{#3}\defunargs{#4\unskip}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% @deftypecv category class type var args
|
|
|
|
|
\makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}}
|
|
|
|
|
\def\deftypecvheaderx#1#2 #3 #4 #5\endheader{%
|
|
|
|
|
\defind{vr}{\code{#4}\space\putwordof\ \code{#2}}%
|
|
|
|
|
\doind{vr}{\code{#4}\space\putwordof\ \code{#2}}%
|
|
|
|
|
\defname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -7708,7 +7715,7 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
|
|
|
|
|
% @deftp category name args
|
|
|
|
|
\makedefun{deftp}#1 #2 #3\endheader{%
|
|
|
|
|
\defind{tp}{\code{#2}}%
|
|
|
|
|
\doind{tp}{\code{#2}}%
|
|
|
|
|
\defname{#1}{}{#2}\defunargs{#3\unskip}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -8580,6 +8587,87 @@ might help (with 'rm \jobname.?? \jobname.??s')%
|
|
|
|
|
\fi \macnamexxx}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% @linemacro
|
|
|
|
|
|
|
|
|
|
\parseargdef\linemacro{%
|
|
|
|
|
\linegetargs#1 \linegetargs
|
|
|
|
|
\expandafter\linegetparamlist\argl;%
|
|
|
|
|
\begingroup \macrobodyctxt \usembodybackslash
|
|
|
|
|
\parselinemacrobody
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% Parse the arguments to a @linemacro line. Set \macname to the name
|
|
|
|
|
% of the macro and \argl to the list of arguments.
|
|
|
|
|
\def\linegetargs#1 #2\linegetargs{%
|
|
|
|
|
\macname={#1}%
|
|
|
|
|
\def\argl{#2}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% Build up \paramlist which will be used as the parameter text for the macro.
|
|
|
|
|
% At the end it will be like "#1 #2 #3\endlinemacro".
|
|
|
|
|
\def\linegetparamlist#1;{%
|
|
|
|
|
\paramno=0\def\paramlist{}%
|
|
|
|
|
\let\hash\relax \let\xeatspaces\relax
|
|
|
|
|
\linegetparamlistxxx#1; %
|
|
|
|
|
}
|
|
|
|
|
\def\linegetparamlistxxx#1 {%
|
|
|
|
|
\if#1;\let\next=\linegetparamlistxxxx
|
|
|
|
|
\else \let\next=\linegetparamlistxxx
|
|
|
|
|
\advance\paramno by 1
|
|
|
|
|
\expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
|
|
|
|
|
{\noexpand\xeatspaces{\hash\the\paramno}}%
|
|
|
|
|
\edef\paramlist{\paramlist\hash\the\paramno\space}%
|
|
|
|
|
\fi\next}
|
|
|
|
|
\def\linegetparamlistxxxx{%
|
|
|
|
|
\ifx\paramlist\empty
|
|
|
|
|
\def\paramlist{\hash 1\endlinemacro}%
|
|
|
|
|
\else
|
|
|
|
|
\expandafter\fixparamlist\paramlist\fixparamlist
|
|
|
|
|
\fi
|
|
|
|
|
}
|
|
|
|
|
% Replace final space token
|
|
|
|
|
\def\fixparamlist#1 \fixparamlist{%
|
|
|
|
|
\def\paramlist{#1\endlinemacro}%
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
% Read the body of the macro, replacing backslash-surrounded variables
|
|
|
|
|
%
|
|
|
|
|
{\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{%
|
|
|
|
|
\let\xeatspaces\relax
|
|
|
|
|
\xdef\macrobody{#1}%
|
|
|
|
|
\endgroup
|
|
|
|
|
\linemacrodef
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
|
|
% Make the definition
|
|
|
|
|
\def\linemacrodef{%
|
|
|
|
|
\let\hash=##%
|
|
|
|
|
\let\xeatspaces\relax
|
|
|
|
|
\expandafter\xdef\csname\the\macname\endcsname{%
|
|
|
|
|
\bgroup
|
|
|
|
|
\noexpand\scanctxt
|
|
|
|
|
\noexpand\parsearg
|
|
|
|
|
\expandafter\noexpand\csname\the\macname @@\endcsname
|
|
|
|
|
}
|
|
|
|
|
\expandafter\xdef\csname\the\macname @@\endcsname##1{%
|
|
|
|
|
\egroup
|
|
|
|
|
\expandafter\noexpand
|
|
|
|
|
\csname\the\macname @@@\endcsname##1 \noexpand\endlinemacro
|
|
|
|
|
% Note that we append a space to the macro line to terminate the last
|
|
|
|
|
% argument in case the final argument is empty. @xeatspaces may be needed
|
|
|
|
|
% to remove this space.
|
|
|
|
|
}
|
|
|
|
|
\expandafter\expandafter
|
|
|
|
|
\expandafter\xdef
|
|
|
|
|
\expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{%
|
|
|
|
|
\newlinechar=13 % split \macrobody into lines
|
|
|
|
|
\let\noexpand\xeatspaces\noexpand\eatspaces
|
|
|
|
|
\noexpand\scantokens{\macrobody}%
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% @alias.
|
|
|
|
|
% We need some trickery to remove the optional spaces around the equal
|
|
|
|
|
% sign. Make them active and then expand them all to nothing.
|
|
|
|
|
|