build: Use ACLTX_TEXMF_PATH for installation.
[mdwtools] / mdwtools.tex
CommitLineData
86f6a31e 1% \begin{meta-comment}
2%
21d3670d 3% $Id: mdwtools.tex,v 1.2 2003/09/05 16:15:33 mdw Exp $
86f6a31e 4%
5% Common declarations for mdwtools.dtx files
6%
7% (c) 1996 Mark Wooding
8%
86f6a31e 9% \end{meta-comment}
10%
11% \begin{meta-comment} <general public licence>
12%%
13%% mdwtools common declarations
14%% Copyright (c) 1996 Mark Wooding
15%%
16%% This program is free software; you can redistribute it and/or modify
17%% it under the terms of the GNU General Public License as published by
18%% the Free Software Foundation; either version 2 of the License, or
19%% (at your option) any later version.
20%%
21%% This program is distributed in the hope that it will be useful,
22%% but WITHOUT ANY WARRANTY; without even the implied warranty of
23%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24%% GNU General Public License for more details.
25%%
26%% You should have received a copy of the GNU General Public License
27%% along with this program; if not, write to the Free Software
28%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29%%
30% \end{meta-comment}
31%
32% \begin{meta-comment} <file preamble>
33%<*mdwtools>
34\ProvidesFile{mdwtools.tex}
35 [1996/05/10 1.4 Shared definitions for mdwtools .dtx files]
36%</mdwtools>
37% \end{meta-comment}
38%
21d3670d 39% \CheckSum{672}
86f6a31e 40%% \CharacterTable
41%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
42%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
43%% Digits \0\1\2\3\4\5\6\7\8\9
44%% Exclamation \! Double quote \" Hash (number) \#
45%% Dollar \$ Percent \% Ampersand \&
46%% Acute accent \' Left paren \( Right paren \)
47%% Asterisk \* Plus \+ Comma \,
48%% Minus \- Point \. Solidus \/
49%% Colon \: Semicolon \; Less than \<
50%% Equals \= Greater than \> Question mark \?
51%% Commercial at \@ Left bracket \[ Backslash \\
52%% Right bracket \] Circumflex \^ Underscore \_
53%% Grave accent \` Left brace \{ Vertical bar \|
54%% Right brace \} Tilde \~}
55%%
56%
57% \section{Introduction and user guide}
58%
59% This file is really rather strange; it gets |\input| by other package
60% documentation files to set up most of the environmental gubbins for them.
61% It handles almost everything, like loading a document class, finding any
62% packages, and building and formatting the title.
63%
64% It also offers an opportunity for users to customise my nice documentation,
65% by using a |mdwtools.cfg| file (not included).
66%
67%
68% \subsection{Declarations}
69%
70% A typical documentation file contains something like
71% \begin{listinglist} \listingsize \obeylines
72% |\input{mdwtools}|
73% \<declarations>
74% |\mdwdoc|
75% \end{listinglist}
76% The initial |\input| reads in this file and sets up the various commands
77% which may be needed. The final |\mdwdoc| actually starts the document,
78% inserting a title (which is automatically generated), a table of
79% contents etc., and reads the documentation file in (using the |\DocInput|
80% command from the \package{doc} package.
81%
82% \subsubsection{Describing packages}
83%
84% \DescribeMacro{\describespackage}
85% \DescribeMacro{\describesclass}
86% \DescribeMacro{\describesfile}
87% \DescribeMacro{\describesfile*}
88% The most important declarations are those which declare what the
89% documentation describes. Saying \syntax{"\\describespackage{<package>}"}
90% loads the \<package> (if necessary) and adds it to the auto-generated
91% title, along with a footnote containing version information. Similarly,
92% |\describesclass| adds a document class name to the title (without loading
93% it -- the document itself must do this, with the |\documentclass| command).
94% For files which aren't packages or classes, use the |\describesfile| or
95% |\describesfile*| command (the $*$-version won't |\input| the file, which
96% is handy for files like |mdwtools.tex|, which are already input).
97%
98% \DescribeMacro{\author}
99% \DescribeMacro{\date}
100% \DescribeMacro{\title}
101% The |\author|, |\date| and |\title| declarations work slightly differently
102% to normal -- they ensure that only the \emph{first} declaration has an
103% effect. (Don't you play with |\author|, please, unless you're using this
104% program to document your own packages.) Using |\title| suppresses the
105% automatic title generation.
106%
107% \DescribeMacro{\docdate}
108% The default date is worked out from the version string of the package or
109% document class whose name is the same as that of the documentation file.
110% You can choose a different `main' file by saying
111% \syntax{"\\docdate{"<file>"}"}.
112%
113% \subsubsection{Contents handling}
114%
115% \DescribeMacro{\addcontents}
116% A documentation file always has a table of contents. Other
117% contents-like lists can be added by saying
118% \syntax{"\\addcontents{"<extension>"}{"<command>"}"}. The \<extension>
119% is the file extension of the contents file (e.g., \lit{lot} for the
120% list of tables); the \<command> is the command to actually typeset the
121% contents file (e.g., |\listoftables|).
122%
123% \subsubsection{Other declarations}
124%
125% \DescribeMacro{\implementation}
126% The \package{doc} package wants you to say
127% \syntax{"\\StopEventually{"<stuff>"}"}' before describing the package
128% implementation. Using |mdwtools.tex|, you just say |\implementation|, and
129% everything works. It will automatically read in the licence text (from
130% |gpl.tex|, and wraps some other things up.
131%
132%
133% \subsection{Other commands}
134%
135% The |mdwtools.tex| file includes the \package{syntax} and \package{sverb}
136% packages so that they can be used in documentation files. It also defines
137% some trivial commands of its own.
138%
139% \DescribeMacro{\<}
140% Saying \syntax{"\\<"<text>">" is the same as "\\synt{"<text>"}"}; this
141% is a simple abbreviation.
142%
143% \DescribeMacro{\smallf}
144% Saying \syntax{"\\smallf" <number>"/"<number>} typesets a little fraction,
145% like this: \smallf 3/4. It's useful when you want to say that the default
146% value of a length is 2 \smallf 1/2\,pt, or something like that.
147%
148%
149% \subsection{Customisation}
150%
151% You can customise the way that the package documentation looks by writing
152% a file called |mdwtools.cfg|. You can redefine various commands (before
153% they're defined here, even; |mdwtools.tex| checks most of the commands that
154% it defines to make sure they haven't been defined already.
155%
156% \DescribeMacro{\indexing}
157% If you don't want the prompt about whether to generate index files, you
158% can define the |\indexing| command to either \lit{y} or \lit{n}. I'd
159% recommend that you use |\providecommand| for this, to allow further
160% customisation from the command line.
161%
162% \DescribeMacro{\mdwdateformat}
163% If you don't like my date format (maybe you're American or something),
164% you can redefine the |\mdwdateformat| command. It takes three arguments:
165% the year, month and date, as numbers; it should expand to something which
166% typesets the date nicely. The default format gives something like
167% `10 May 1996'. You can produce something rather more exotic, like
168% `10\textsuperscript{th} May \textsc{\romannumeral 1996}' by saying
169%\begin{listing}
170%\newcommand{\mdwdateformat}[3]{%
171% \number#3\textsuperscript{\numsuffix{#3}}\ %
172% \monthname{#2}\ %
173% \textsc{\romannumeral #1}%
174%}
175%\end{listing}
176% \DescribeMacro{\monthname}
177% \DescribeMacro{\numsuffix}
178% Saying \syntax{"\\monthname{"<number>"}"} expands to the name of the
179% numbered month (which can be useful when doing date formats). Saying
180% \syntax{"\\numsuffix{"<number>"}"} will expand to the appropriate suffix
181% (`th' or `rd' or whatever) for the \<number>. You'll have to superscript
182% it yourself, if this is what you want to do. Putting the year number
183% in roman numerals is just pretentious |;-)|.
184%
185% \DescribeMacro{\mdwhook}
186% After all the declarations in |mdwtools.tex|, the command |\mdwhook| is
187% executed, if it exists. This can be set up by the configuration file
188% to do whatever you want.
189%
190% There are lots of other things you can play with; you should look at the
191% implementation section to see what's possible.
192%
193% \implementation
194%
195% \section{Implementation}
196%
197% \begin{macrocode}
198%<*mdwtools>
199% \end{macrocode}
200%
201% The first thing is that I'm not a \LaTeX\ package or anything official
202% like that, so I must enable `|@|' as a letter by hand.
203%
204% \begin{macrocode}
205\makeatletter
206% \end{macrocode}
207%
208% Now input the user's configuration file, if it exists. This is fairly
209% simple stuff.
210%
211% \begin{macrocode}
212\@input{mdwtools.cfg}
213% \end{macrocode}
214%
215% Well, that's the easy bit done.
216%
217%
218% \subsection{Initialisation}
219%
220% Obviously the first thing to do is to obtain a document class. Obviously,
221% it would be silly to do this if a document class has already been loaded,
222% either by the package documentation or by the configuration file.
223%
224% The only way I can think of for finding out if a document class is already
225% loaded is by seeing if the |\documentclass| command has been redefined
226% to raise an error. This isn't too hard, really.
227%
228% \begin{macrocode}
229\ifx\documentclass\@twoclasseserror\else
230 \documentclass[a4paper]{ltxdoc}
231 \ifx\doneclasses\mdw@undefined\else\doneclasses\fi
232\fi
233% \end{macrocode}
234%
235% As part of my standard environment, I'll load some of my more useful
236% packages. If they're already loaded (possibly with different options),
237% I'll not try to load them again.
238%
239% \begin{macrocode}
240\@ifpackageloaded{doc}{}{\usepackage{doc}}
241\@ifpackageloaded{syntax}{}{\usepackage[rounded]{syntax}}
242\@ifpackageloaded{sverb}{}{\usepackage{sverb}}
243% \end{macrocode}
244%
245%
246% \subsection{Some macros for interaction}
247%
248% I like the \LaTeX\ star-boxes, although it's a pain having to cope with
249% \TeX's space-handling rules. I'll define a new typing-out macro which
250% makes spaces more significant, and has a $*$-version which doesn't put
251% a newline on the end, and interacts prettily with |\read|.
252%
253% First of all, I need to make spaces active, so I can define things about
254% active spaces.
255%
256% \begin{macrocode}
257\begingroup\obeyspaces
258% \end{macrocode}
259%
260% Now to define the main macro. This is easy stuff. Spaces must be
261% carefully rationed here, though.
262%
263% I'll start a group, make spaces active, and make spaces expand to ordinary
264% space-like spaces. Then I'll look for a star, and pass either |\message|
265% (which doesn't start a newline, and interacts with |\read| well) or
266% |\immediate\write 16| which does a normal write well.
267%
268% \begin{macrocode}
269\gdef\mdwtype{%
270\begingroup\catcode`\ \active\let \space%
271\@ifstar{\mdwtype@i{\message}}{\mdwtype@i{\immediate\write\sixt@@n}}%
272}
273\endgroup
274% \end{macrocode}
275%
276% Now for the easy bit. I have the thing to do, and the thing to do it to,
277% so do that and end the group.
278%
279% \begin{macrocode}
280\def\mdwtype@i#1#2{#1{#2}\endgroup}
281% \end{macrocode}
282%
283%
284% \subsection{Decide on indexing}
285%
286% A configuration file can decide on indexing by defining the |\indexing|
287% macro to either \lit{y} or \lit{n}. If it's not set, then I'll prompt
288% the user.
289%
290% First of all, I want a switch to say whether I'm indexing.
291%
292% \begin{macrocode}
293\newif\ifcreateindex
294% \end{macrocode}
295%
296% Right: now I need to decide how to make progress. If the macro's not set,
297% then I want to set it, and start a row of stars.
298%
299% \begin{macrocode}
300\ifx\indexing\@@undefined
301 \mdwtype{*****************************}
302 \def\indexing{?}
303\fi
304% \end{macrocode}
305%
306% Now enter a loop, asking the user whether to do indexing, until I get
307% a sensible answer.
308%
309% \begin{macrocode}
310\loop
311 \@tempswafalse
312 \if y\indexing\@tempswatrue\createindextrue\fi
313 \if Y\indexing\@tempswatrue\createindextrue\fi
314 \if n\indexing\@tempswatrue\createindexfalse\fi
315 \if N\indexing\@tempswatrue\createindexfalse\fi
316 \if@tempswa\else
317 \mdwtype*{* Create index files? (y/n) *}
318 \read\sixt@@n to\indexing%
319\repeat
320% \end{macrocode}
321%
322% Now, based on the results of that, display a message about the indexing.
323%
324% \begin{macrocode}
325\mdwtype{*****************************}
326\ifcreateindex
327 \mdwtype{* Creating index files *}
328 \mdwtype{* This may take some time *}
329\else
330 \mdwtype{* Not creating index files *}
331\fi
332\mdwtype{*****************************}
333% \end{macrocode}
334%
335% Now I can play with the indexing commands of the \package{doc} package
336% to do whatever it is that the user wants.
337%
338% \begin{macrocode}
339\ifcreateindex
340 \CodelineIndex
341 \EnableCrossrefs
342\else
343 \CodelineNumbered
344 \DisableCrossrefs
345\fi
346% \end{macrocode}
347%
348% And register lots of plain \TeX\ things which shouldn't be indexed.
349% This contains lots of |\if|\dots\ things which don't fit nicely in
350% conditionals, which is a shame. Still, it doesn't matter that much,
351% really.
352%
353% \begin{macrocode}
354\DoNotIndex{\def,\long,\edef,\xdef,\gdef,\let,\global}
355\DoNotIndex{\if,\ifnum,\ifdim,\ifcat,\ifmmode,\ifvmode,\ifhmode,%
356 \iftrue,\iffalse,\ifvoid,\ifx,\ifeof,\ifcase,\else,\or,\fi}
357\DoNotIndex{\box,\copy,\setbox,\unvbox,\unhbox,\hbox,%
358 \vbox,\vtop,\vcenter}
359\DoNotIndex{\@empty,\immediate,\write}
360\DoNotIndex{\egroup,\bgroup,\expandafter,\begingroup,\endgroup}
361\DoNotIndex{\divide,\advance,\multiply,\count,\dimen}
362\DoNotIndex{\relax,\space,\string}
363\DoNotIndex{\csname,\endcsname,\@spaces,\openin,\openout,%
364 \closein,\closeout}
365\DoNotIndex{\catcode,\endinput}
366\DoNotIndex{\jobname,\message,\read,\the,\m@ne,\noexpand}
367\DoNotIndex{\hsize,\vsize,\hskip,\vskip,\kern,\hfil,\hfill,\hss}
368\DoNotIndex{\m@ne,\z@,\z@skip,\@ne,\tw@,\p@}
369\DoNotIndex{\dp,\wd,\ht,\vss,\unskip}
370% \end{macrocode}
371%
372% Last bit of indexing stuff, for now: I'll typeset the index in two columns
373% (the default is three, which makes them too narrow for my tastes).
374%
375% \begin{macrocode}
376\setcounter{IndexColumns}{2}
377% \end{macrocode}
378%
379%
380% \subsection{Selectively defining things}
381%
382% I don't want to tread on anyone's toes if they redefine any of these
383% commands and things in a configuration file. The following definitions
384% are fairly evil, but should do the job OK.
385%
386% \begin{macro}{\@gobbledef}
387%
388% This macro eats the following |\def|inition, leaving not a trace behind.
389%
390% \begin{macrocode}
391\def\@gobbledef#1#{\@gobble}
392% \end{macrocode}
393%
394% \end{macro}
395%
396% \begin{macro}{\tdef}
397% \begin{macro}{\tlet}
398%
399% The |\tdef| command is a sort of `tentative' definition -- it's like
400% |\def| if the control sequence named doesn't already have a definition.
401% |\tlet| does the same thing with |\let|.
402%
403% \begin{macrocode}
404\def\tdef#1{
405 \ifx#1\@@undefined%
406 \expandafter\def\expandafter#1%
407 \else%
408 \expandafter\@gobbledef%
409 \fi%
410}
411\def\tlet#1#2{\ifx#1\@@undefined\let#1=#2\fi}
412% \end{macrocode}
413%
414% \end{macro}
415% \end{macro}
416%
417%
418% \subsection{General markup things}
419%
420% Now for some really simple things. I'll define how to typeset package
421% names and environment names (both in the sans serif font, for now).
422%
423% \begin{macrocode}
424\tlet\package\textsf
425\tlet\env\textsf
426% \end{macrocode}
427%
428% I'll define the |\<|\dots|>| shortcut for syntax items suggested in the
429% \package{syntax} package.
430%
431% \begin{macrocode}
432\tdef\<#1>{\synt{#1}}
433% \end{macrocode}
434%
435% And because it's used in a few places (mainly for typesetting lengths),
436% here's a command for typesetting fractions in text.
437%
438% \begin{macrocode}
439\tdef\smallf#1/#2{\ensuremath{^{#1}\!/\!_{#2}}}
440% \end{macrocode}
441%
442%
443% \subsection{A table environment}
444%
445% \begin{environment}{tab}
446%
447% Most of the packages don't use the (obviously perfect) \package{mdwtab}
448% package, because it's big, and takes a while to load. Here's an
449% environment for typesetting centred tables. The first (optional) argument
450% is some declarations to perform. The mandatory argument is the table
451% preamble (obviously).
452%
453% \begin{macrocode}
454\@ifundefined{tab}{%
455 \newenvironment{tab}[2][\relax]{%
456 \par\vskip2ex%
457 \centering%
458 #1%
459 \begin{tabular}{#2}%
460 }{%
461 \end{tabular}%
462 \par\vskip2ex%
463 }
464}{}
465% \end{macrocode}
466%
467% \end{environment}
468%
469%
470% \subsection{Commenting out of stuff}
471%
472% \begin{environment}{meta-comment}
473%
474% Using |\iffalse|\dots|\fi| isn't much fun. I'll define a gobbling
475% environment using the \package{sverb} stuff.
476%
477% \begin{macrocode}
478\ignoreenv{meta-comment}
479% \end{macrocode}
480%
481% \end{environment}
482%
483%
484% \subsection{Float handling}
485%
486% This gubbins will try to avoid float pages as much as possible, and (with
487% any luck) encourage floats to be put on the same pages as text.
488%
489% \begin{macrocode}
490\def\textfraction{0.1}
491\def\topfraction{0.9}
492\def\bottomfraction{0.9}
493\def\floatpagefraction{0.7}
494% \end{macrocode}
495%
496% Now redefine the default float-placement parameters to allow `here' floats.
497%
498% \begin{macrocode}
499\def\fps@figure{htbp}
500\def\fps@table{htbp}
501% \end{macrocode}
502%
503%
504% \subsection{Other bits of parameter tweaking}
505%
506% Make \env{grammar} environments look pretty, by indenting the left hand
507% sides by a large amount.
508%
509% \begin{macrocode}
510\grammarindent1in
511% \end{macrocode}
512%
513% I don't like being told by \TeX\ that my paragraphs are hard to linebreak:
514% I know this already. This lot should shut \TeX\ up about most problems.
515%
516% \begin{macrocode}
517\sloppy
518\hbadness\@M
519\hfuzz10\p@
520% \end{macrocode}
521%
522% Also make \TeX\ shut up in the index. The \package{multicol} package
523% irritatingly plays with |\hbadness|. This is the best hook I could find
524% for playing with this setting.
525%
526% \begin{macrocode}
527\expandafter\def\expandafter\IndexParms\expandafter{%
528 \IndexParms%
529 \hbadness\@M%
530}
531% \end{macrocode}
532%
533% The other thing I really don't like is `Marginpar moved' warnings. This
534% will get rid of them, and lots of other \LaTeX\ warnings at the same time.
535%
536% \begin{macrocode}
537\let\@latex@warning@no@line\@gobble
538% \end{macrocode}
539%
540% Put some extra space between table rows, please.
541%
542% \begin{macrocode}
543\def\arraystretch{1.2}
544% \end{macrocode}
545%
546% Most of the code is at guard level one, so typeset that in upright text.
547%
548% \begin{macrocode}
549\setcounter{StandardModuleDepth}{1}
550% \end{macrocode}
551%
552%
553% \subsection{Contents handling}
554%
555% I use at least one contents file (the main table of contents) although
556% I may want more. I'll keep a list of contents files which I need to
557% handle.
558%
559% There are two things I need to do to contents files here:
560% \begin{itemize}
561% \item I must typeset the table of contents at the beginning of the
562% document; and
563% \item I want to typeset tables of contents in two columns (using the
564% \package{multicol} package).
565% \end{itemize}
566%
567% The list consists of items of the form
568% \syntax{"\\do{"<extension>"}{"<command>"}"}, where \<extension> is the
569% file extension of the contents file, and \<command> is the command to
570% typeset it.
571%
572% \begin{macro}{\docontents}
573%
574% This is where I keep the list of contents files. I'll initialise it to
575% just do the standard contents table.
576%
577% \begin{macrocode}
578\def\docontents{\do{toc}{\tableofcontents}}
579% \end{macrocode}
580%
581% \end{macro}
582%
583% \begin{macro}{\addcontents}
584%
585% By saying \syntax{"\\addcontents{"<extension>"}{"<command>"}"}, a document
586% can register a new table of contents which gets given the two-column
587% treatment properly. This is really easy to implement.
588%
589% \begin{macrocode}
590\def\addcontents#1#2{%
591 \toks@\expandafter{\docontents\do{#1}{#2}}%
592 \edef\docontents{\the\toks@}%
593}
594% \end{macrocode}
595%
596% \end{macro}
597%
598%
599% \subsection{Finishing it all off}
600%
601% \begin{macro}{\finalstuff}
602%
603% The |\finalstuff| macro is a hook for doing things at the end of the
604% document. Currently, it inputs the licence agreement as an appendix.
605%
606% \begin{macrocode}
607\tdef\finalstuff{\appendix\part*{Appendix}\input{gpl}}
608% \end{macrocode}
609%
610% \end{macro}
611%
612% \begin{macro}{\implementation}
613%
614% The |\implementation| macro starts typesetting the implementation of
615% the package(s). If we're not doing the implementation, it just does
616% this lot and ends the input file.
617%
618% I define a macro with arguments inside the |\StopEventually|, which causes
619% problems, since the code gets put through an extra level of |\def|fing
620% depending on whether the implementation stuff gets typeset or not. I'll
621% store the code I want to do in a separate macro.
622%
623% \begin{macrocode}
624\def\implementation{\StopEventually{\attheend}}
625% \end{macrocode}
626%
627% Now for the actual activity. First, I'll do the |\finalstuff|. Then, if
628% \package{doc}'s managed to find the \package{multicol} package, I'll add
629% the end of the environment to the end of each contents file in the list.
630% Finally, I'll read the index in from its formatted |.ind| file.
631%
632% \begin{macrocode}
633\tdef\attheend{%
634 \finalstuff%
635 \ifhave@multicol%
636 \def\do##1##2{\addtocontents{##1}{\protect\end{multicols}}}%
637 \docontents%
638 \fi%
639 \PrintIndex%
640}
641% \end{macrocode}
642%
643% \end{macro}
644%
645%
646% \subsection{File version information}
647%
648% \begin{macro}{\mdwpkginfo}
649%
650% For setting up the automatic titles, I'll need to be able to work out
651% file versions and things. This macro will, given a file name, extract
652% from \LaTeX\ the version information and format it into a sensible string.
653%
654% First of all, I'll put the original string (direct from the
655% |\Provides|\dots\ command). Then I'll pass it to another macro which can
656% parse up the string into its various bits, along with the original
657% filename.
658%
659% \begin{macrocode}
660\def\mdwpkginfo#1{%
661 \edef\@tempa{\csname ver@#1\endcsname}%
662 \expandafter\mdwpkginfo@i\@tempa\@@#1\@@%
663}
664% \end{macrocode}
665%
666% Now for the real business. I'll store the string I build in macros called
667% \syntax{"\\"<filename>"date", "\\"<filename>"version" and
668% "\\"<filename>"info"}, which store the file's date, version and
669% `information string' respectively. (Note that the file extension isn't
670% included in the name.)
671%
672% This is mainly just tedious playing with |\expandafter|. The date format
673% is defined by a separate macro, which can be modified from the
674% configuration file.
675%
676% \begin{macrocode}
677\def\mdwpkginfo@i#1/#2/#3 #4 #5\@@#6.#7\@@{%
678 \expandafter\def\csname #6date\endcsname%
679 {\protect\mdwdateformat{#1}{#2}{#3}}%
680 \expandafter\def\csname #6version\endcsname{#4}%
681 \expandafter\def\csname #6info\endcsname{#5}%
682}
683% \end{macrocode}
684%
685% \end{macro}
686%
687% \begin{macro}{\mdwdateformat}
688%
689% Given three arguments, a year, a month and a date (all numeric), build a
690% pretty date string. This is fairly simple really.
691%
692% \begin{macrocode}
693\tdef\mdwdateformat#1#2#3{\number#3\ \monthname{#2}\ \number#1}
694\def\monthname#1{%
695 \ifcase#1\or%
696 January\or February\or March\or April\or May\or June\or%
697 July\or August\or September\or October\or November\or December%
698 \fi%
699}
700\def\numsuffix#1{%
701 \ifnum#1=1 st\else%
702 \ifnum#1=2 nd\else%
703 \ifnum#1=3 rd\else%
704 \ifnum#1=21 st\else%
705 \ifnum#1=22 nd\else%
706 \ifnum#1=23 rd\else%
707 \ifnum#1=31 st\else%
708 th%
709 \fi\fi\fi\fi\fi\fi\fi%
710}
711% \end{macrocode}
712%
713% \end{macro}
714%
715% \begin{macro}{\mdwfileinfo}
716%
717% Saying \syntax{"\\mdwfileinfo{"<file-name>"}{"<info>"}"} extracts the
718% wanted item of \<info> from the version information for file \<file-name>.
719%
720% \begin{macrocode}
721\def\mdwfileinfo#1#2{\mdwfileinfo@i{#2}#1.\@@}
722\def\mdwfileinfo@i#1#2.#3\@@{\csname#2#1\endcsname}
723% \end{macrocode}
724%
725% \end{macro}
726%
727%
728% \subsection{List handling}
729%
730% There are several other lists I need to build. These macros will do
731% the necessary stuff.
732%
733% \begin{macro}{\mdw@ifitem}
734%
735% The macro \syntax{"\\mdw@ifitem"<item>"\\in"<list>"{"<true-text>"}"^^A
736% "{"<false-text>"}"} does \<true-text> if the \<item> matches any item in
737% the \<list>; otherwise it does \<false-text>.
738%
739% \begin{macrocode}
740\def\mdw@ifitem#1\in#2{%
741 \@tempswafalse%
742 \def\@tempa{#1}%
743 \def\do##1{\def\@tempb{##1}\ifx\@tempa\@tempb\@tempswatrue\fi}%
744 #2%
745 \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
746}
747% \end{macrocode}
748%
749% \end{macro}
750%
751% \begin{macro}{\mdw@append}
752%
753% Saying \syntax{"\\mdw@append"<item>"\\to"<list>} adds the given \<item>
754% to the end of the given \<list>.
755%
756% \begin{macrocode}
757\def\mdw@append#1\to#2{%
758 \toks@{\do{#1}}%
759 \toks\tw@\expandafter{#2}%
760 \edef#2{\the\toks\tw@\the\toks@}%
761}
762% \end{macrocode}
763%
764% \end{macro}
765%
766% \begin{macro}{\mdw@prepend}
767%
768% Saying \syntax{"\\mdw@prepend"<item>"\\to"<list>} adds the \<item> to the
769% beginning of the \<list>.
770%
771% \begin{macrocode}
772\def\mdw@prepend#1\to#2{%
773 \toks@{\do{#1}}%
774 \toks\tw@\expandafter{#2}%
775 \edef#2{\the\toks@\the\toks\tw@}%
776}
777% \end{macrocode}
778%
779% \end{macro}
780%
781% \begin{macro}{\mdw@add}
782%
783% Finally, saying \syntax{"\\mdw@add"<item>"\\to"<list>} adds the \<item>
784% to the list only if it isn't there already.
785%
786% \begin{macrocode}
787\def\mdw@add#1\to#2{\mdw@ifitem#1\in#2{}{\mdw@append#1\to#2}}
788% \end{macrocode}
789%
790% \end{macro}
791%
792%
793% \subsection{Described file handling}
794%
795% I'l maintain lists of packages, document classes, and other files
796% described by the current documentation file.
797%
798% First of all, I'll declare the various list macros.
799%
800% \begin{macrocode}
801\def\dopackages{}
802\def\doclasses{}
803\def\dootherfiles{}
804% \end{macrocode}
805%
806% \begin{macro}{\describespackage}
807%
808% A document file can declare that it describes a package by saying
809% \syntax{"\\describespackage{"<package-name>"}"}. I add the package to
810% my list, read the package into memory (so that the documentation can
811% offer demonstrations of it) and read the version information.
812%
813% \begin{macrocode}
814\def\describespackage#1{%
815 \mdw@ifitem#1\in\dopackages{}{%
816 \mdw@append#1\to\dopackages%
817 \usepackage{#1}%
818 \mdwpkginfo{#1.sty}%
819 }%
820}
821% \end{macrocode}
822%
823% \end{macro}
824%
825% \begin{macro}{\describesclass}
826%
827% By saying \syntax{"\\describesclass{"<class-name>"}"}, a document file
828% can declare that it describes a document class. I'll assume that the
829% document class is already loaded, because it's much too late to load
830% it now.
831%
832% \begin{macrocode}
833\def\describesclass#1{\mdw@add#1\to\doclasses\mdwpkginfo{#1.cls}}
834% \end{macrocode}
835%
836% \end{macro}
837%
838% \begin{macro}{\describesfile}
839%
840% Finally, other `random' files, which don't have the status of real \LaTeX\
841% packages or document classes, can be described by saying \syntax{^^A
842% "\\describesfile{"<file-name>"}" or "\\describesfile*{"<file-name>"}"}.
843% The difference is that the starred version will not |\input| the file.
844%
845% \begin{macrocode}
846\def\describesfile{%
847 \@ifstar{\describesfile@i\@gobble}{\describesfile@i\input}%
848}
849\def\describesfile@i#1#2{%
850 \mdw@ifitem#2\in\dootherfiles{}{%
851 \mdw@add#2\to\dootherfiles%
852 #1{#2}%
853 \mdwpkginfo{#2}%
854 }%
855}
856% \end{macrocode}
857%
858% \end{macro}
859%
860%
861% \subsection{Author and title handling}
862%
863% I'll redefine the |\author| and |\title| commands so that I get told
864% whether I need to do it myself.
865%
866% \begin{macro}{\author}
867%
868% This is easy: I'll save the old meaning, and then redefine |\author| to
869% do the old thing and redefine itself to then do nothing.
870%
871% \begin{macrocode}
872\let\mdw@author\author
873\def\author{\let\author\@gobble\mdw@author}
874% \end{macrocode}
875%
876% \end{macro}
877%
878% \begin{macro}{\title}
879%
880% And oddly enough, I'll do exactly the same thing for the title, except
881% that I'll also disable the |\mdw@buildtitle| command, which constructs
882% the title automatically.
883%
884% \begin{macrocode}
885\let\mdw@title\title
886\def\title{\let\title\@gobble\let\mdw@buildtitle\relax\mdw@title}
887% \end{macrocode}
888%
889% \end{macro}
890%
891% \begin{macro}{\date}
892%
893% This works in a very similar sort of way.
894%
895% \begin{macrocode}
896\def\date#1{\let\date\@gobble\def\today{#1}}
897% \end{macrocode}
898%
899% \end{macro}
900%
901% \begin{macro}{\datefrom}
902%
903% Saying \syntax{"\\datefrom{"<file-name>"}"} sets the document date from
904% the given filename.
905%
906% \begin{macrocode}
907\def\datefrom#1{%
908 \protected@edef\@tempa{\noexpand\date{\csname #1date\endcsname}}%
909 \@tempa%
910}
911% \end{macrocode}
912%
913% \end{macro}
914%
915% \begin{macro}{\docfile}
916%
917% Saying \syntax{"\\docfile{"<file-name>"}"} sets up the file name from which
918% documentation will be read.
919%
920% \begin{macrocode}
921\def\docfile#1{%
922 \def\@tempa##1.##2\@@{\def\@basefile{##1.##2}\def\@basename{##1}}%
923 \edef\@tempb{\noexpand\@tempa#1\noexpand\@@}%
924 \@tempb%
925}
926% \end{macrocode}
927%
928% I'll set up a default value as well.
929%
930% \begin{macrocode}
931\docfile{\jobname.dtx}
932% \end{macrocode}
933%
934% \end{macro}
935%
936%
937% \subsection{Building title strings}
938%
939% This is rather tricky. For each list, I need to build a legible looking
940% string.
941%
942% \begin{macro}{\mdw@addtotitle}
943%
944% By saying
945%\syntax{"\\mdw@addtotitle{"<list>"}{"<command>"}{"<singular>"}{"<plural>"}"}
946% I can add the contents of a list to the current title string in the
947% |\mdw@title| macro.
948%
949% \begin{macrocode}
950\tdef\mdw@addtotitle#1#2#3#4{%
951% \end{macrocode}
952%
953% Now to get to work. I need to keep one `lookahead' list item, and a count
954% of the number of items read so far. I'll keep the lookahead item in
955% |\@nextitem| and the counter in |\count@|.
956%
957% \begin{macrocode}
958 \count@\z@%
959% \end{macrocode}
960%
961% Now I'll define what to do for each list item. The |\protect| command is
962% already set up appropriately for playing with |\edef| commands.
963%
964% \begin{macrocode}
965 \def\do##1{%
966% \end{macrocode}
967%
968% The first job is to add the previous item to the title string. If this
969% is the first item, though, I'll just add the appropriate \lit{The } or
970% \lit{ and the } string to the title (this is stored in the |\@prefix|
971% macro).
972%
973% \begin{macrocode}
974 \edef\mdw@title{%
975 \mdw@title%
976 \ifcase\count@\@prefix%
977 \or\@nextitem%
978 \else, \@nextitem%
979 \fi%
980 }%
981% \end{macrocode}
982%
983% That was rather easy. Now I'll set up the |\@nextitem| macro for the
984% next time around the loop.
985%
986% \begin{macrocode}
987 \edef\@nextitem{%
988 \protect#2{##1}%
989 \protect\footnote{%
990 The \protect#2{##1} #3 is currently at version %
991 \mdwfileinfo{##1}{version}, dated \mdwfileinfo{##1}{date}.%
992 }\space%
993 }%
994% \end{macrocode}
995%
996% Finally, I need to increment the counter.
997%
998% \begin{macrocode}
999 \advance\count@\@ne%
1000 }%
1001% \end{macrocode}
1002%
1003% Now execute the list.
1004%
1005% \begin{macrocode}
1006 #1%
1007% \end{macrocode}
1008%
1009% I still have one item left over, unless the list was empty. I'll add
1010% that now.
1011%
1012% \begin{macrocode}
1013 \edef\mdw@title{%
1014 \mdw@title%
1015 \ifcase\count@%
1016 \or\@nextitem\space#3%
1017 \or\ and \@nextitem\space#4%
21d3670d 1018 \else,\ and \@nextitem\space#4%
86f6a31e 1019 \fi%
1020 }%
1021% \end{macrocode}
1022%
1023% Finally, if $|\count@| \ne 0$, I must set |\@prefix| to \lit{ and the }.
1024%
1025% \begin{macrocode}
1026 \ifnum\count@>\z@\def\@prefix{ and the }\fi%
1027}
1028% \end{macrocode}
1029%
1030% \end{macro}
1031%
1032% \begin{macro}{\mdw@buildtitle}
1033%
1034% This macro will actually do the job of building the title string.
1035%
1036% \begin{macrocode}
1037\tdef\mdw@buildtitle{%
1038% \end{macrocode}
1039%
1040% First of all, I'll open a group to avoid polluting the namespace with
1041% my gubbins (although the code is now much tidier than it has been in
1042% earlier releases).
1043%
1044% \begin{macrocode}
1045 \begingroup%
1046% \end{macrocode}
1047%
1048% The title building stuff makes extensive use of |\edef|. I'll set
1049% |\protect| appropriately. (For those not in the know,
1050% |\@unexpandable@protect| expands to `|\noexpand\protect\noexpand|',
1051% which prevents expansion of the following macro, and inserts a |\protect|
1052% in front of it ready for the next |\edef|.)
1053%
1054% \begin{macrocode}
1055 \let\@@protect\protect\let\protect\@unexpandable@protect%
1056% \end{macrocode}
1057%
1058% Set up some simple macros ready for the main code.
1059%
1060% \begin{macrocode}
1061 \def\mdw@title{}%
1062 \def\@prefix{The }%
1063% \end{macrocode}
1064%
1065% Now build the title. This is fun.
1066%
1067% \begin{macrocode}
1068 \mdw@addtotitle\dopackages\package{package}{packages}%
1069 \mdw@addtotitle\doclasses\package{document class}{document classes}%
1070 \mdw@addtotitle\dootherfiles\texttt{file}{files}%
1071% \end{macrocode}
1072%
1073% Now I want to end the group and set the title from my string. The
1074% following hacking will do this.
1075%
1076% \begin{macrocode}
1077 \edef\next{\endgroup\noexpand\title{\mdw@title}}%
1078 \next%
1079}
1080% \end{macrocode}
1081%
1082% \end{macro}
1083%
1084%
1085% \subsection{Starting the main document}
1086%
1087% \begin{macro}{\mdwdoc}
1088%
1089% Once the document preamble has done all of its stuff, it calls the
1090% |\mdwdoc| command, which takes over and really starts the documentation
1091% going.
1092%
1093% \begin{macrocode}
1094\def\mdwdoc{%
1095% \end{macrocode}
1096%
1097% First, I'll construct the title string.
1098%
1099% \begin{macrocode}
1100 \mdw@buildtitle%
1101 \author{Mark Wooding}%
1102% \end{macrocode}
1103%
1104% Set up the date string based on the date of the package which shares
1105% the same name as the current file.
1106%
1107% \begin{macrocode}
1108 \datefrom\@basename%
1109% \end{macrocode}
1110%
1111% Set up verbatim characters after all the packages have started.
1112%
1113% \begin{macrocode}
1114 \shortverb\|%
1115 \shortverb\"%
1116% \end{macrocode}
1117%
1118% Start the document, and put the title in.
1119%
1120% \begin{macrocode}
1121 \begin{document}
1122 \maketitle%
1123% \end{macrocode}
1124%
1125% This is nasty. It makes maths displays work properly in demo environments.
1126% \emph{The \LaTeX\ Companion} exhibits the bug which this hack fixes. So
1127% ner.
1128%
1129% \begin{macrocode}
1130 \abovedisplayskip\z@%
1131% \end{macrocode}
1132%
1133% Now start the contents tables. After starting each one, I'll make it
1134% be multicolumnar.
1135%
1136% \begin{macrocode}
1137 \def\do##1##2{%
1138 ##2%
1139 \ifhave@multicol\addtocontents{##1}{%
1140 \protect\begin{multicols}{2}%
1141 \hbadness\@M%
1142 }\fi%
1143 }%
1144 \docontents%
1145% \end{macrocode}
1146%
1147% Input the main file now.
1148%
1149% \begin{macrocode}
1150 \DocInput{\@basefile}%
1151% \end{macrocode}
1152%
1153% That's it. I'm done.
1154%
1155% \begin{macrocode}
1156 \end{document}
1157}
1158% \end{macrocode}
1159%
1160% \end{macro}
1161%
1162%
1163% \subsection{And finally\dots}
1164%
1165% Right at the end I'll put a hook for the configuration file.
1166%
1167% \begin{macrocode}
1168\ifx\mdwhook\@@undefined\else\expandafter\mdwhook\fi
1169% \end{macrocode}
1170%
1171% That's all the code done now. I'll change back to `user' mode, where
1172% all the magic control sequences aren't allowed any more.
1173%
1174% \begin{macrocode}
1175\makeatother
1176%</mdwtools>
1177% \end{macrocode}
1178%
1179% Oh, wait! What if I want to typeset this documentation? Aha. I'll cope
1180% with that by comparing |\jobname| with my filename |mdwtools|. However,
1181% there's some fun here, because |\jobname| contains category-12 letters,
1182% while my letters are category-11. Time to play with |\string| in a messy
1183% way.
1184%
1185% \begin{macrocode}
1186%<*driver>
1187\makeatletter
1188\edef\@tempa{\expandafter\@gobble\string\mdwtools}
1189\edef\@tempb{\jobname}
1190\ifx\@tempa\@tempb
1191 \describesfile*{mdwtools.tex}
1192 \docfile{mdwtools.tex}
1193 \makeatother
1194 \expandafter\mdwdoc
1195\fi
1196\makeatother
1197%</driver>
1198% \end{macrocode}
1199%
1200% That's it. Done!
1201%
1202% \hfill Mark Wooding, \today
1203%
1204% \Finale
1205%
1206\endinput