summaryrefslogtreecommitdiff
path: root/texinfo.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@gnu.org>1998-06-19 11:50:37 +0000
committerKarl Berry <karl@gnu.org>1998-06-19 11:50:37 +0000
commit4f79de612bac5da5ec172283c2c4147d2fd3753f (patch)
tree8ad18dba1ad0e2757162007f88f1744ead4998d5 /texinfo.tex
parentea9504a609ed99414a0fbd42d0b43303beb2e48f (diff)
downloadgunmake-4f79de612bac5da5ec172283c2c4147d2fd3753f.tar.gz
* texinfo.tex: @macro fixes from Zack Weinberg
<zack@rabi.phys.columbia.edu>. - @ifblah did not work inside @macro - spaces in parameter lists in macro definitions caused errors - leading spaces in parameter lists in macro invocations were preserved inappropriately.
Diffstat (limited to 'texinfo.tex')
-rw-r--r--texinfo.tex113
1 files changed, 47 insertions, 66 deletions
diff --git a/texinfo.tex b/texinfo.tex
index 91a9c03..284d699 100644
--- a/texinfo.tex
+++ b/texinfo.tex
@@ -4377,7 +4377,6 @@ width0pt\relax} \fi
\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
-
\message{macros,}
% @macro.
@@ -4386,9 +4385,8 @@ width0pt\relax} \fi
\ifx\eTeXversion\undefined
\newwrite\macscribble
\def\scantokens#1{%
-% \toks0={#1}%
\immediate\openout\macscribble=\jobname.tmp
- \immediate\write\macscribble{#1}%\the\toks0}%
+ \immediate\write\macscribble{#1}%
\immediate\closeout\macscribble
\input \jobname.tmp
}
@@ -4410,6 +4408,10 @@ width0pt\relax} \fi
% all characters are catcode 10, 11 or 12, except \ which is active
% (as in normal texinfo). It is necessary to change the definition of \.
+% It's necessary to get hard CRs in the scribble file when using Knuth
+% TeX, and it can't hurt with e-TeX. Texinfo sets \newlinechar=`^^J,
+% so we redefine the \endlinechar to ^^J when reading the macro body.
+
\def\macrobodyctxt{%
\catcode`\~=12
\catcode`\^=12
@@ -4421,7 +4423,7 @@ width0pt\relax} \fi
\catcode`\{=12
\catcode`\}=12
\catcode`\@=12
- \catcode`\^^M=10
+ \endlinechar`^^J%
\usembodybackslash}
% \mbodybackslash is the definition of \ in @macro bodies.
@@ -4430,28 +4432,21 @@ width0pt\relax} \fi
% We define \csname macarg.\endcsname to be \realbackslash, so
% \\ in macro replacement text gets you a backslash.
-{\catcode`@=0 \catcode`\\=\active
+{\catcode`@=0 @catcode`@\=@active
@gdef@usembodybackslash{@let\=@mbodybackslash}
@gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
}
\expandafter\def\csname macarg.\endcsname{\realbackslash}
-% The catcode games are necessary because @macro may or may not
-% have a brace-surrounded list of arguments, and we need to do
-% different stuff in each case. Making {, } \other is the only
-% way to prevent their being deleted by the tokenizer.
-\def\macro{\recursivefalse
- \bgroup\catcode`\{=\other\catcode`\}=\other\parsearg\macroxxx}
-\def\rmacro{\recursivetrue
- \bgroup\catcode`\{=\other\catcode`\}=\other\parsearg\macroxxx}
-
-\def\macroxxx#1{\egroup % started in \macro
- \getargs{#1}% now \macname is the macname and \toks0 the arglist
- \edef\temp{\the\toks0}%
- \ifx\temp\empty % no arguments
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
\paramno=0%
\else
- \expandafter\parsemargdef \the\toks0;%
+ \expandafter\parsemargdef \argl;%
\fi
\expandafter\ifx \csname macsave.\the\macname\endcsname \relax
\cslet{macsave.\the\macname}{\the\macname}%
@@ -4464,7 +4459,7 @@ width0pt\relax} \fi
\fi}
\def\unmacro{\parsearg\unmacroxxx}
-\def\unmacroxxx#1{
+\def\unmacroxxx#1{%
\expandafter\ifx \csname macsave.\the\macname\endcsname \relax
\errmessage{Macro \the\macname\ not defined.}%
\else
@@ -4473,43 +4468,54 @@ width0pt\relax} \fi
\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.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
% 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.
% That gets used by \mbodybackslash (above).
-% This code has to take great care with `macro parameter char #'. The
-% eight hashes in a row on the macarg.#1 line collapse to four in the
-% definition of \macarg.blah, to two when \parsemacbody expands the
-% macro replacement text, and to one when \defmacro writes the macro
-% definiton. The games with \twohash are to postpone expansion till
-% the very end, when \parsemargdefyyy crunches \paramlist into
-% something that can be splatted into a \expandafter\def\blah line (in
-% \defmacro).
-\def\parsemargdef#1;{\paramno=0\def\paramlist{}\parsemargdefxxx#1,;,}
+% 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.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\parsemargdefxxx#1,;,}
\def\parsemargdefxxx#1,{%
- \let\twohash\relax
- \if#1;\let\next=\parsemargdefyyy
+ \if#1;\let\next=\relax
\else \let\next=\parsemargdefxxx
\advance\paramno by 1%
- \expandafter\edef\csname macarg.#1\endcsname{########\the\paramno}%
- \edef\paramlist{\paramlist\twohash\twohash\the\paramno,}%
+ \eatspaces#1 \relax% output to \toks0
+ \expandafter\edef\csname macarg.\the\toks0\endcsname
+ {\ignorespaces \hash\the\paramno}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
\fi\next}
-\def\parsemargdefyyy{\let\twohash##\relax \edef\paramlist{\paramlist}}
+\def\eatspaces#1 #2\relax{\def\temp{#1}%
+ \ifx\temp\empty \let\nexteat\eatspaces
+ \else \toks0={#1}\let\nexteat\eatspacesx \fi
+ \nexteat#2 \relax}
+\def\eatspacesx#1 \relax{}
% These two commands read recursive and nonrecursive macro bodies.
% (They're different since rec and nonrec macros end differently.)
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{#1} \endgroup\defmacro}%
-\long\def\parsermacbody#1@end macro%
-{\xdef\temp{#1} \endgroup\defmacro}%
-
+\long\def\parsemacbody#1^^J@end macro^^J%
+{\xdef\temp{#1}\endgroup\defmacro}%
+\long\def\parsermacbody#1^^J@end rmacro^^J%
+{\xdef\temp{#1}\endgroup\defmacro}%
% This defines the macro itself. There are six cases: recursive and
% nonrecursive macros of zero, one, and many arguments.
% Much magic with \expandafter here.
\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
\ifrecursive
\ifcase\paramno
% 0
@@ -4539,7 +4545,7 @@ width0pt\relax} \fi
\expandafter\edef\csname\the\macname\endcsname{%
\noexpand\braceorline\csname\the\macname xxx\endcsname}%
\expandafter\edef\csname\the\macname xxx\endcsname##1{%
- \noexpand\norecurse{\the\macname}
+ \noexpand\norecurse{\the\macname}%
\noexpand\scantokens{\temp}\egroup}%
\else % many
\expandafter\edef\csname\the\macname\endcsname##1{%
@@ -4549,7 +4555,7 @@ width0pt\relax} \fi
\expandafter\expandafter
\csname\the\macname xxx\endcsname
\paramlist{%
- \noexpand\norecurse{\the\macname}
+ \noexpand\norecurse{\the\macname}%
\noexpand\scantokens{\temp}\egroup}%
\fi
\fi}
@@ -4566,31 +4572,6 @@ width0pt\relax} \fi
\expandafter\parsearg
\fi \next}
-% We need {} to be \other inside these commands. [] are temporary
-% grouping symbols.
-\begingroup
-\catcode`\{=\other \catcode`\}=\other
-\catcode`\[=1 \catcode`\]=2
-
-% @macro can be called with or without a brace-surrounded macro
-% argument list. These three sequences extract the macro name and arg
-% list in hopefully all cases. Note that anything on the line after the
-% first pair of braces will be thrown out (Makeinfo puts it into the
-% macro body).
-\gdef\getargs#1[\getargsxxx|#1 {}|]
-\gdef\getargsxxx|#1 {#2}#3|[%
- \toks0=[#2]%
- \edef\tmp[\the\toks0]%
- \ifx\tmp\empty
- \getargsnospaces|#1{}|%
- \else
- \macname=[#1]%
- \fi]
-\gdef\getargsnospaces|#1{#2}#3|[\macname=[#1]\toks0=[#2]]
-
-\endgroup
-
-
\message{cross references,}
\newwrite\auxfile