]> mj.ucw.cz Git - ucwmac.git/blob - ucw-verb.tex
ucw-ref: Fixed bug in \pageid
[ucwmac.git] / ucw-verb.tex
1 % The UCW Macro Collection: Verbatim environments
2 % Written by Martin Mares <mj@ucw.cz> in 2010 and placed into public domain
3 % -------------------------------------------------------------------------
4
5 \ucwdefmodule{verb}
6
7 % We'll use internal macros of plain TeX
8 \catcode`@=11
9
10 % New \frenchspacing, which doesn't leave unwanted spaces in text.
11 \def\frenchsp@cing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m%
12 \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
13
14 % Typesetting of one verbatim word: |word| (enable by \inlineverbon)
15
16 % Set if spaces should be rendered as "bath-tub" glyphs
17 \newif\ifshowspaces
18 \showspacesfalse
19
20 \def\make@ther#1{\catcode`#1=12\relax}
21 \def\setverb@tim{\tt\frenchsp@cing\catcode`\`=13\catcode`\'=13\n@ligs%
22 \let\do=\make@ther\dospecials\obeyspaces\showsp@ces}
23
24 {\catcode`'=13
25 \catcode``=13
26 \gdef\n@ligs{\def`{\relax\lq}\def'{\relax\rq}}}
27
28 {\obeyspaces
29 \global\chardef\sp@ce=32
30 \gdef\showsp@ces{\ifshowspaces\let =\sp@ce\fi}
31 \global\let =\ }
32
33 {\catcode124=\active % Make | active
34 \gdef\ttst@rt{\begingroup\setverb@tim\let|=\endgroup}
35 \gdef\inlineverbon{\catcode124=\active\let|=\ttst@rt}
36 \gdef\inlineverboff{\catcode124=12}
37 }
38
39 % Typesetting of verbatim text with a given delimiter:
40 %       - usage: \verb%verbatim text%
41 %       - the delimiter is the first character after \verb
42 %       - remember that writing (for example) \verbz with meaning \verb
43 %         with the delimiter 'z' is possible only if \catcode`z is not 11
44
45 \def\verb{\relax\def\sv@rb##1{\uccode`~=`##1%
46 \uppercase{\catcode`~13\global\let~\endgroup}}%
47 \begingroup\setverb@tim\do\|\sv@rb}
48
49 % Typesetting of verbatim blocks:
50 %       - the block is enclosed in balanced {}'s
51 %       - leading and trailing empty lines are ignored
52 %       - all other empty lines are converted to \verbemptylineskip's
53 %       - tabs are interpreted (one tab stop per \verbtabsize columns)
54 %       - \showspacestrue works here, too, but it does not apply to tabs
55
56 \newskip\verbstartskip          % vskip before \verbatim
57 \newskip\verbendskip            % vskip after \verbatim
58 \newskip\verbinterlineskip      % between adjacent non-empty lines
59 \newskip\verbemptylineskip      % instead of every empty line
60 \newskip\verbleftskip           % left and right margin
61 \newskip\verbrightskip
62
63 \verbstartskip=3pt plus 1pt minus 0.3pt
64 \verbendskip=\verbstartskip
65 \verbinterlineskip=0pt
66 \verbemptylineskip=5pt plus 2pt
67 \verbleftskip=0in
68 \verbrightskip=0pt plus 1fil
69
70 % Can be re-defined to customize the verbatim environment
71 \def\verblocaldefs{}
72
73 % Size of a single tab
74 \newcount\verbtabsize
75 \verbtabsize=8
76
77 \newdimen\v@rbspace
78 \newdimen\t@b
79 \newdimen\t@bwidth
80
81 % When a complete line is assembled in \box0, \verbship is called to add it
82 % to the main vertical list. You can override it to get e.g. line numbering.
83 \def\verbship{%
84         \ifdim\wd0>0pt
85                 \ifdim\v@rbspace>0pt
86                         \penalty-100
87                         \vskip\v@rbspace
88                 \else
89                         \ifdim\v@rbspace=0pt
90                                 \vskip\verbinterlineskip
91                         \fi
92                 \fi
93                 \line{\hskip\verbleftskip \box0 \hskip\verbrightskip}
94                 \v@rbspace=0pt
95         \else
96                 \advance\v@rbspace by \verbemptylineskip
97         \fi
98 }
99
100 \newcount\verbcnt
101 \def\v@rbend{\par\egroup\endgroup\vskip\verbendskip}
102 \def\v@rbl{\ifnum\verbcnt>0\{\fi\global\advance\verbcnt by 1\relax}
103 \def\v@rbr{\ifnum\verbcnt>1\}\else\v@rbend\fi\global\advance\verbcnt by -1\relax}
104
105 \def\v@rbparams{%
106         \setverb@tim
107         \raggedbottom
108         \verbcnt=0
109         \v@rbspace=-1000pt
110         \catcode124=12
111         \vskip\verbstartskip
112         \let\par=\endb@x
113         \obeylines
114 }
115
116 \def\startb@x{\setbox0=\hbox\bgroup}
117 \def\endb@x{\egroup\verbship\startb@x}
118
119 {\catcode`\^^I=\active
120 \gdef\setupt@bs{\catcode`\^^I=\active
121 \setbox0=\hbox{\ }\t@bwidth=\wd0\multiply\t@bwidth by \verbtabsize
122 \def^^I{\egroup\t@b=\wd0\divide\t@b by \t@bwidth%
123 \multiply\t@b by \t@bwidth%
124 \advance\t@b by \t@bwidth\advance\t@b by -\wd0\startb@x\box0\hbox to \t@b{}}%
125 }}
126
127 {
128 \catcode`[=1\catcode`]=2\catcode123=\active\catcode125=\active
129 \gdef\verbatim[\begingroup\v@rbparams\catcode123=\active\catcode125=\active%
130 \let{=\v@rbl\let}=\v@rbr\chardef\{=123\chardef\}=125\verblocaldefs\setupt@bs\startb@x%
131 ]]
132
133 % Input file verbatim
134
135 \def\verbinput#1{\begingroup\v@rbparams\verblocaldefs\setupt@bs\startb@x\input #1 \v@rbend}
136
137 % Let's hide all internal macros
138 \catcode`@=12