summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/genmisc/verbatim.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/genmisc/verbatim.tex')
-rw-r--r--Master/texmf-dist/tex/generic/genmisc/verbatim.tex258
1 files changed, 258 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/genmisc/verbatim.tex b/Master/texmf-dist/tex/generic/genmisc/verbatim.tex
new file mode 100644
index 00000000000..11d684db6f3
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/genmisc/verbatim.tex
@@ -0,0 +1,258 @@
+\catcode `\@ = 11 %%% we use commercial-at as a letter throughout;
+\chardef \l@tter = 11 %%% and introduce synonyms for the \catcodes for
+\chardef \@ther = 12 %%% <letter> and <other>;
+\newcount \c@unt %%% a loop-counter;
+\newcount \ch@rcode %%% this will hold the character-code of the
+ %%% escape character;
+\newif \ifd@bugging %%% set <true> if you want to watch the
+ %%% finite-state automaton at work;
+\newif \ifshewleadingspaces %%% set <true> if you want to see leading spaces
+ %%% shewn as inverted square cup (explicit);
+\newif \ifshewembeddedspaces %%% set <false> if you want to see embedded
+\shewembeddedspacestrue %%% spaces shewn as white space (implicit);
+\ifd@bugging %%% if <debugging>,
+ \let \m@ssage = \message %%% \m@ssage is synonymous with \message
+\else %%% otherwise
+ \def \m@ssage #1{}% %%% it simply throws its parameter away;
+\fi
+%
+\def \verbatim %%% the \verbatim macro takes no parameter
+ {\begingroup %%% and immediately starts a nested group
+ \tracingonline = 0
+ \def \n@sted %%% within which \n@sted is defined
+ {\begingroup %%% to start a further group within which
+ \let \n@sted %%% \n@sted becomes a synonym for \endgroup
+ = \endgroup
+ \@nvironment %%% and the environment is restored to that
+ %%% which obtained two levels of nesting out;
+ \ignorespaces %%% for tidyness, we ignore any <lwsp>
+ }% %%% which follows the escape character;
+ \edef \@nvironment %%% we initialise \@nvironment
+ {\the \font %%% who forgot this ?????
+ \parindent = %%% to prepare to restore \parindent
+ \the \parindent
+ \parskip = %%% and \parskip;
+ \the \parskip
+ \space %%% and ensure that the value to be assigned to
+ }% %%% \parskip is properly terminated;
+ \displayverbatimfont %%% we assume Knuth's font-selectors and
+ %%% select the `typewriter' font;
+ \parskip = 0 pt %%% we then set \parindent and
+ \parindent = 0 pt %%% \parskip to 0 pt;
+ \c@unt = 0 %%% and initialise \count to 0;
+ \loop %%% this loop checks the \catcode of each
+ %%% character code in the range 0 .. 127
+ %%% (or 0 .. 255 for TeX V3) and if it
+ %%% is other than <letter> or <other>, as
+ %%% appropriate, saves the current value in
+ %%% \@nvironment for subsequent restoration
+ %%% within an inner group; it then sets the
+ %%% \catcode to either <letter> or <other>;
+ \ifnum \c@unt < `\A
+ \s@ve \catcode \c@unt = \@ther
+ \else \ifnum \c@unt > `\z
+ \s@ve \catcode \c@unt = \@ther
+ \else \ifnum \c@unt > `\Z
+ \ifnum \c@unt < `\a
+ \s@ve \catcode \c@unt = \@ther
+ \else \s@ve \catcode \c@unt = \l@tter
+ \fi
+ \else \s@ve \catcode \c@unt = \l@tter
+ \fi
+ \fi
+ \fi
+ \advance \c@unt by 1
+ \ifnum \c@unt < 256 % or 128 for the V2 sites ...
+ \repeat
+ \v@rbatim
+ }
+%
+\def \v@rbatim #1% %%%
+ {\if #1 %%%
+ \let \n@xt = \v@rb@tim %%%
+ \else %%%
+ \def \n@xt %%%
+ {\v@rb@tim #1}% %%%
+ \fi %%%
+ \n@xt %%%
+ } %%%
+%
+\def \v@rb@tim #1%
+ {\ch@rcode = `#1 %%%
+ \edef \@nvironment %%% and append code to \@nvironment
+ {\@nvironment %%% to make the escape character active;
+ \catcode \the \ch@rcode
+ = \active
+ \space %%% <space> separates list items in \@nvironment
+ }%
+ \catcode \ch@rcode %%% the escape character is made active;
+ = \active
+ \uccode `\^^M = \ch@rcode %%% and the upper-case code of <return> is made
+ %%% equal to the character-code of the escape
+ %%% character; this is necessary because only
+ %%% <return> can be guaranteed to be active at
+ %%% this point, and we need an active character
+ %%% to form the primary operand of \def;
+ %%% the \@x's below are \expandafter's,
+ %%% and the effect is to upper-case <return>
+ %%% (yielding the escape character), then \def
+ %%% (an active instance of) this character as
+ %%% \n@sted, which has been defined above;
+%
+ \@x \uppercase \@x {\@x \def \r@turn {\n@sted}}%
+%
+ \uccode `\^^M = 0 %%% the upper-case code of <return> is then re-
+ %%% instated (not strictly true; it is set to 0,
+ %%% which is assumed to be its previous value
+ %%% --- could be improved here);
+ \@ctivecr %%% <return> is made active;
+ \@ctivespace %%% and so is <space> (to avoid space-elision);
+ %%% finally, the finite-state automaton which
+ }% %%% processes <space>s is set to <????>;
+ %%% this ends the definition of \verbatim.
+%
+\def \s@ve #1#2=#3% %%% \s@ve minimises the \catcode restoration
+ {\ifnum #1#2 = #3% %%% work of \@nvironment by saving only the
+ %%% \catcode of characters whose \catcode
+ %%% is to be changed; it then changes the
+ %%% \catcode of those characters.
+ \else \edef \@nvironment
+ {\@nvironment #1\the #2=\the #1#2 }%
+ #1#2 = #3%
+ \fi
+ }%
+ %%% the code which follows implements the finite
+ %%% state automaton which determines whether
+ %%% <space>s are ignored, shewn explicitly or
+ %%% implied, and which ensures that blank
+ %%% lines are reproduced correctly.
+%
+\def \v@id {\futurelet \n@xt \v@idifspace}%
+\def \l@ad {\l@adingspace \futurelet \n@xt \l@adifspace}%
+\def \sk@p {\vskip \baselineskip \futurelet \n@xt \l@adifspace}%
+\def \emb@d {\emb@ddedspace}%
+\def \sh@wspace {\char 32\relax}%
+\def \h@despace {\leavevmode \kern \fontdimen 2 \font}%
+\def \l@adingspace {\ifshewleadingspaces \sh@wspace \else \h@despace \fi}%
+\def \emb@ddedspace {\ifshewembeddedspaces \sh@wspace \else \h@despace \fi}%
+\def \v@idifspace {\testn@xt {\afterassignment \v@id}}%
+\def \l@adifspace {\testn@xt {\afterassignment \sk@p}}%
+%
+ %%% \testn@xt provides a common look-ahead for
+ %%% \v@idifspace and \l@adifspace, and also
+\def \testn@xt #1% %%% implements some essential debugging hooks.
+ {\ifx \n@xt \sp@c@
+ \m@ssage {Next character is a space}%
+ \let \n@xt = \relax
+ \else \ifx \n@xt \r@t@rn
+ \m@ssage {Next character is a return}%
+ \def \n@xt {#1\let \n@xt = }%
+ \else \m@ssage {Next character is \meaning \n@xt}%
+ \let \n@xt = \relax
+ \@x \let \sp@ce = \emb@d
+ \fi
+ \fi
+ \n@xt
+ }%
+%
+ %%% We next tamper with the \catcode of <space>
+ %%% and <return>, while defining macros and
+ %%% synonyms which require them to be active;
+ %%% the \catcode is then restored to its default
+ %%% (not necessarily the previous value ---
+ %%% could be improved). \@ctivespace makes
+ %%% <space> active, then defines <space> as
+\catcode `\ = \active% %%% \v@id with a synonym \sp@c@. This code is
+\def\sp@ce{ }% %%% used by the finite-state automaton.
+\def\@ctivespace%
+{\catcode`\ =\active\def {\v@id}\let\sp@c@= }\catcode`\ =10\relax%
+\catcode`\ =10\relax%
+%
+\catcode `\^^M = \active % %%% <return> is made active;
+\def \r@turn {^^M}% %%% \r@turn defined as an active <return>;
+\let \r@t@rn = ^^M% %%% \r@t@rn is made a synonym;
+\def \@ctivecr % %%% and \@ctivecr is defined to
+ {\catcode `\^^M = \active % %%% make <return> active, then
+ \def ^^M% %%% define <return> to manipulate the
+ %%% finite-state automaton and ...
+ {\@x \def \sp@ce {\l@ad}%
+ \@x \let \@x \sp@c@ \@x =\sp@ce %
+%
+ \endgraf % %%% insert a \par primitive (for blank lines).
+%
+ \futurelet \n@xt \l@adifspace %
+ }%
+ \let \r@t@rn = ^^M% %%% \r@t@rn is synonymous with active <return>
+ }%
+\catcode `\^^M = 5 % %%% finally, the \catcode of <return> is
+ %%% restored to its normal value;
+%
+ %%% the \AfterGroup macro is intended for
+ %%% use within a nested normal environment,
+ %%% and causes (a concealed macro defined as)
+ %%% its parameter text to be inserted into
+ %%% TeX's input stream when the nested normal
+ %%% group terminates.
+%
+\def \AfterGroup #1{\global \def \@ftergroup {#1}\aftergroup \@ftergroup}%
+%
+\let \@x = \expandafter %%% \@x is a brief synonym for \expandafter;
+%
+%
+\def \mitabrev %%% and \mitabrev defined as the closure for
+ {\endgroup \endgroup}% %%% \verbatim; any other name could be used,
+ %%% as the code performs no look-ahead for
+ %%% any particular string.
+%
+ %%% Finally we announce to the world that we
+ %%% have been loaded, and gives some clues as
+ %%% to the usage.
+%
+
+\catcode `\Ý = \active
+\catcode `\| = \active
+
+\def Ý{\begingroup
+ \def \s@lidus ##1Ý{\inlineverbatimfont ##1\endgroup}%
+ \p@ssivate \activesp@ces \s@lidus
+ }
+
+\def |{\begingroup
+
+ \def \s@lidus ##1|{\inlineverbatimfont ##1\endgroup}%
+ \p@ssivate \activesp@ces \s@lidus
+ }
+
+\def \p@ssivate
+ {\tracingonline = 0
+ \c@unt = 0
+ \loop
+ \ifnum \catcode \c@unt = 11 {}%
+ \else \ifnum \catcode \c@unt = 12 {}%
+ \else \catcode \c@unt = 12
+ \fi
+ \fi
+ \ifnum
+ \c@unt < 255
+ \advance \c@unt by 1
+ \repeat
+ \catcode `\Ý = \active
+ \catcode `\| = \active
+ }
+
+\begingroup
+\catcode `\ = \active\gdef\activesp@ce{\def {\phantom{\char`\ }}}%
+\endgroup
+
+\def \activesp@ces {\catcode `\ = \active \activesp@ce}
+
+\catcode `\@ = \@ther %%% commercial-at is restored to its normal
+ %%% <other> catcode (not necessarily the
+ %%% previous value --- could be improved);
+
+\message {Verbatim environment loaded;}%
+\message {usage: ``\noexpand \verbatim <char> ... <char> \noexpand \mitabrev''}%
+\message {less functional short forms: \string Ý...\string Ý &
+ \string |...\string |}%
+
+%%% ======================================================================== %%%