]> mj.ucw.cz Git - ucwmac.git/commitdiff
\verbatim finished
authorMartin Mares <mj@ucw.cz>
Sat, 25 Sep 2010 13:42:47 +0000 (15:42 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 9 Oct 2010 11:05:45 +0000 (13:05 +0200)
ucwmac-test.tex
ucwmac.tex

index 0987ff5790b3ce00c6ac2e03a02cd72a7ded5c5d..d28427cfeb6cebc022ed2fb3ec9c9793815d2f0f 100644 (file)
@@ -75,4 +75,6 @@ abracadabra {!@#$%^&*()\_}
 }
 \noindent Post-verbatim
 
+%\verbinput{ucwmac.tex}
+
 \bye
index afd2829267c2461b187aaf4ebd704131333989c4..da83a1c846f900bea344ae8d6325b5e37d9649f2 100644 (file)
 \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 %%%