summaryrefslogtreecommitdiff
path: root/macros/plain/contrib/misc/redefine.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/plain/contrib/misc/redefine.tex')
-rw-r--r--macros/plain/contrib/misc/redefine.tex83
1 files changed, 83 insertions, 0 deletions
diff --git a/macros/plain/contrib/misc/redefine.tex b/macros/plain/contrib/misc/redefine.tex
new file mode 100644
index 0000000000..9b24b024e7
--- /dev/null
+++ b/macros/plain/contrib/misc/redefine.tex
@@ -0,0 +1,83 @@
+% -*- Mode: TeX -*-
+
+\ifx\thisfileis\anUndefinedMacro\input maybeload \fi
+
+\thisfileis{<eb.tex.texlocal>redefine} % abort loading if we're already loaded
+
+% The LaTex macros in this file provide redefinition warnings.
+% Also, the LaTex \newcommand facility is changed so that using
+% \newcommand to redefine a function produces only a warning
+% message, not an error.
+
+% A control sequence equivalent to \relax is considered
+% undefined, as in LaTex.
+
+% However, allocation commands such as \newtoks are changed so
+% that no redefinition takes place if their arguments are already
+% defined.
+
+\makeatletter
+
+\edef\@backslash{\expandafter\@car\string\relax\@nil}
+
+\def\@warnredef#1{\typeout{WARNING: The `#1' control sequence is being redefined.}}
+
+\def\@warnnoredef#1{\typeout{WARNING: Aborting redefinition of the `#1' control sequence.}}
+
+\def\@ifcsundefined#1#2#3{\ifx #1\anUndefinedMacro
+ \def\@@temp{#2}\else\ifx #1\relax\def\@@temp{#2}\else
+ \def\@@temp{#3}\fi\fi\@@temp}
+
+% Change LaTex behavior.
+
+\def\@notdefinable{\@warnredef{\@backslash\@tempa}}
+
+% Define \redefcheck{\ctlseq} that just checks the sequence
+% and ignores it.
+
+\def\redefcheck#1{\@ifcsundefined#1{}{\@warnredef{\string#1}}}
+
+% \redefabort{\oneargdefiner}{\ctlseq} puts out \oneargdefiner\ctlseq,
+% except that if \ctlseq is already defined, it just gobbles both
+% of them.
+
+\def\redefabort#1#2{\@ifcsundefined#2{#1#2}{\@warnnoredef{\string#2}}}
+
+% Define \newdef = \def with \redefcheck, and similarly for \gdef and \let.
+
+\def\newdef#1{\redefcheck{#1}\def#1}
+\def\newgdef#1{\redefcheck{#1}\gdef#1}
+\def\newlet#1{\redefcheck{#1}\let#1}
+
+% Add redefinition checking to \newif.
+% \newif is declared as \outer, so we need to delay the definition
+% of \latexnewif until we've scanned the definition of the new
+% \newif.
+
+\let\@tempa\newif
+\def\newif#1{\redefcheck{#1}\latexnewif#1}
+\let\latexnewif\@tempa
+
+% Now for the allocation commands, which I'm setting up to skip the
+% redefinition if their target control sequences are already defined.
+% These are also declared \outer, but the above \@tempa trick won't work
+% here; it's necessary to use another level of macros.
+
+\def\latexnewbox{\latexouternewbox}
+\let\latexouternewbox\newbox
+\def\newbox#1{\redefabort\latexnewbox{#1}}
+
+\def\latexnewcount{\latexouternewcount}
+\let\latexouternewcount\newcount
+\def\newcount#1{\redefabort\latexnewcount{#1}}
+
+\def\latexnewdimen{\latexouternewdimen}
+\let\latexouternewdimen\newdimen
+\def\newdimen#1{\redefabort\latexnewdimen{#1}}
+
+\def\latexnewtoks{\latexouternewtoks}
+\let\latexouternewtoks\newtoks
+\def\newtoks#1{\redefabort\latexnewtoks{#1}}
+
+\makeatother
+