\def\frenchsp@cing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m%
\sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
-% Typesetting of one verbatim word
+% Typesetting of one verbatim word: |word|
+% Set if spaces should be rendered as "bath-tub" glyphs
\newif\ifshowspaces
\showspacesfalse
\def\ttst@rt{\begingroup\setverb@tim\let|=\endgroup}
\let|=\ttst@rt
-% Typesetting of verbatim block (enclosed in balanced {}'s)
-
-\newskip\verbglue
-\newskip\verblineglue
-\newskip\verbleftskip
+% Typesetting of verbatim blocks:
+% - the block is enclosed in balanced {}'s
+% - leading and trailing empty lines are ignored
+% - all other empty lines are converted to \verbemptylineskip's
+% - tabs are interpreted (one tab stop per \verbtabsize columns)
+% - \showspacestrue works here, too, but it does not apply to tabs
+
+\newskip\verbstartskip % vskip before \verbatim
+\newskip\verbendskip % vskip after \verbatim
+\newskip\verbinterlineskip % between adjacent non-empty lines
+\newskip\verbemptylineskip % instead of every empty line
+\newskip\verbleftskip % left and right margin
\newskip\verbrightskip
-\verbglue=3pt plus 1pt minus 0.3pt
-\verblineglue=0pt plus 1.5pt
-\verbleftskip=1in
+\verbstartskip=3pt plus 1pt minus 0.3pt
+\verbendskip=\verbstartskip
+\verbinterlineskip=0pt
+\verbemptylineskip=5pt plus 2pt
+\verbleftskip=0in
\verbrightskip=0pt plus 1fil
+
+% Can be re-defined to customize the verbatim environment
\def\verblocaldefs{}
-\newdimen\tabwidth
-\newcount\tabsize
-\tabsize=8
-\newdimen\t@b
+% Size of a single tab
+\newcount\verbtabsize
+\verbtabsize=8
\newdimen\v@rbspace
+\newdimen\t@b
+\newdimen\t@bwidth
+% When a complete line is assembled in \box0, \verbship is called to add it
+% to the main vertical list. You can override it to get e.g. line numbering.
\def\verbship{%
\ifdim\wd0>0pt
- \ifdim\v@rbspace>0pt \vskip\v@rbspace \fi
- \line{\hskip\verbleftskip \vrule\box0\vrule \hskip\verbrightskip}
+ \ifdim\v@rbspace>0pt
+ \penalty-100
+ \vskip\v@rbspace
+ \else
+ \ifdim\v@rbspace=0pt
+ \vskip\verbinterlineskip
+ \fi
+ \fi
+ \line{\hskip\verbleftskip \box0 \hskip\verbrightskip}
\v@rbspace=0pt
\else
- \advance\v@rbspace by 0.3\baselineskip %FIXME
+ \advance\v@rbspace by \verbemptylineskip
\fi
}
\newcount\verbcnt
-\def\v@rbend{\par\egroup\endgroup\vskip\verbglue}
+\def\v@rbend{\par\egroup\endgroup\vskip\verbendskip}
\def\v@rbl{\ifnum\verbcnt>0\{\fi\global\advance\verbcnt by 1\relax}
\def\v@rbr{\ifnum\verbcnt>1\}\else\v@rbend\fi\global\advance\verbcnt by -1\relax}
-\def\v@rbparams{\setverb@tim\raggedbottom
-\verbcnt=0
-\v@rbspace=-1000pt
-\catcode124=12\setupt@bs\vskip\verbglue\defb@x\obeylines}
+\def\v@rbparams{%
+ \setverb@tim
+ \raggedbottom
+ \verbcnt=0
+ \v@rbspace=-1000pt
+ \catcode124=12
+ \vskip\verbstartskip
+ \let\par=\endb@x
+ \obeylines
+}
\def\startb@x{\setbox0=\hbox\bgroup}
-\def\defb@x{\def\par{\egroup\verbship\startb@x}}
+\def\endb@x{\egroup\verbship\startb@x}
{\catcode`\^^I=\active
\gdef\setupt@bs{\catcode`\^^I=\active
-\setbox0=\hbox{\tt\ }\tabwidth=\wd0\multiply\tabwidth by \tabsize%FIXME!!!
-\def^^I{\egroup\t@b=\wd0\divide\t@b by \tabwidth%
-\multiply\t@b by \tabwidth%
-\advance\t@b by \tabwidth\advance\t@b by -\wd0\startb@x\box0\hbox to \t@b{}}%
+\setbox0=\hbox{\ }\t@bwidth=\wd0\multiply\t@bwidth by \verbtabsize
+\def^^I{\egroup\t@b=\wd0\divide\t@b by \t@bwidth%
+\multiply\t@b by \t@bwidth%
+\advance\t@b by \t@bwidth\advance\t@b by -\wd0\startb@x\box0\hbox to \t@b{}}%
}}
{
\catcode`[=1\catcode`]=2\catcode123=\active\catcode125=\active
\gdef\verbatim[\begingroup\v@rbparams\catcode123=\active\catcode125=\active%
-\let{=\v@rbl\let}=\v@rbr\chardef\{=123\chardef\}=125\verblocaldefs\startb@x%
+\let{=\v@rbl\let}=\v@rbr\chardef\{=123\chardef\}=125\verblocaldefs\setupt@bs\startb@x%
]]
% Input file verbatim
-\def\verbinput#1{\begingroup\v@rbparams\verblocaldefs\input #1\endgroup}
+\def\verbinput#1{\begingroup\v@rbparams\verblocaldefs\setupt@bs\startb@x\input #1 \egroup\endgroup}
%%% Epilog %%%