1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
|
%^^A* file information
% \iffalse
%
% alatex.dtx -- discussion and documentation of ALaTeX and its standard metaclass
%
% Copyright 1995 Matt Swift <swift@bu.edu>. All rights reserved.
%
% This file is part of the ALaTeX system.
% Please see the file 0areadme.txt for further information.
%
% All correspondence regarding ALaTeX should go to
% Matt Swift <swift@bu.edu>, not the LaTeX maintainers.
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
%
% \fi
%
%^^A* checks
%
%^^A NOTE: The character table, with two %'s, will get written to all files.
%% \CharacterTable
%% {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
%% 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
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%
% \CheckSum{287}
%
%^^A* abstract
% \begin{abstract}
% \ALaTeX{} is a document preparation system that provides the user with all
% the functionality of \LaTeX{} and a general, legal way to override standard
% \LaTeX{} behavior without altering source files. An important consequence is
% that \ALaTeX{} can interpret official \LaTeX{} markup in an abstract way.
%
% This discussion builds on the author's paper ``Modularity in \LaTeX''
% in the forthcoming TUGboat \textbf{16} (3).
% \end{abstract}
% \tableofcontents
% \clearpage
%
% \StopEventually{}
%
% \section{Introduction}
%
% The purpose of writing \ALaTeX{} was to facilitate typesetting official
% \LaTeX{} markup as \emph{abstract} markup, that is, markup that is not fixed
% to a ``standard'' appearance on a typeset page. Official \LaTeX{} markup has
% a standard appearance. Together with the broad portability of the \TeX{}
% program, this standard is a highly valuable feature of \LaTeX. In achieving
% this important goal, however, the \LaTeX{} developers compromised the
% valuable ability of \LaTeX{} to interpret markup abstractly. \ALaTeX{}
% attempts to provide users with the ability to process official \LaTeX{}
% markup with the power of full abstraction, without compromising their ability
% to process official \LaTeX{} markup in the standard way.
%
% You are not allowed to modify the distributed \LaTeX{} files without changing
% their names; yet filenames are how classes and packages are identified. In
% many cases it is desirable to produce \emph{different} \ext{dvi} files from
% the same source document. Suppose you make a small modification of the
% standard \class{article} class. To use it to process a source which calls
% for the \class{article} class, you must either break the law and call your
% derivative class \file{article.cls}, or modify the source to call for a
% different class. Both options are unacceptable, the first for obvious
% reasons, the second because a document class---and indeed all the markup in a
% source---ought to be abstractly descriptive without specifying the details of
% presentation. Font specifications are absurd in a document to be read aloud;
% volume specifications are absurd in a document to be printed; page
% specifications are absurd in a document to be viewed on a screen.
%
% Even were it agreed to privilege a single medium for presentation, sometimes
% the source simply cannot be modified, and making a copy would cause version
% control or storage difficulties, or itself be a violation of law.
%
% It is unnecessary to dwell on the necessary failure of any markup scheme to
% be suitably abstract for all interesting documents and presentation media.
% Fortunately, we are aiming to advance computer-aided typesetting, not the
% philosophy of essence and accident, syntax and semantics. What is true of
% \ALaTeX{} and not of \LaTeX{} is that all directives with a \emph{necessary}
% influence on typeset appearance appear outside the source document.
%
% It is very difficult to have a working \ALaTeX{} without also having a
% working \LaTeX. For this reason, \ALaTeX{} is unlikely to compromise the
% availability and ubiquity of systems that conveniently produce standard
% \LaTeX{} \ext{dvi} files from sources containing official \LaTeX{} markup.
% To help insure this harmlessness (and for lack of a reasonable alternative),
% \ALaTeX{} as distributed produces \ext{dvi} files identical to ones that
% \LaTeX{} produces from the same source. Differences are conceivable only in
% the perverse cases listed in Appendix \ref{perverse}.
%
% Abstracting those cases, therefore, a user must actively alter \LaTeX{} or
% \ALaTeX{} before she can produce a \ext{dvi} file that differs from the one
% standard \LaTeX{} produces from the same source file. \ALaTeX, however, is
% much easier to alter in useful ways than \LaTeX.
%
% \begin{em}
% When you compose a document, please preview it with (standard) \LaTeX.
% There is absolutely no reason at all to use \ALaTeX{} during document
% composition. Using \LaTeX{} will ensure that your document can be
% consistently compiled and viewed at every \LaTeX{} site in the world. Use
% \ALaTeX{} \emph{only} on existing sources when you can't or don't want to
% modify them, and yet want to present them in a nonstandard way.
% \end{em}
%
% \section{How \ALaTeX{} works}
%
% Most of the \ALaTeX{} distribution is designed to make a single small change
% to the \LaTeX{} kernel easy and legal to use. The change causes the
% |\documentclass| command to store its arguments in variables and load the
% file \file{metaclas.cfg} called the \term{metaclass} before continuing.
% That's it!
%
% The significance of this change is in the variety and scope of what can be
% accomplished by code in the metaclass. In the metaclass, the |@| character
% is a letter, as in normal class files.
%
% \DescribeMacro\mc@class@options
% \DescribeMacro\mc@class@name
% \DescribeMacro\mc@class@version
% When the metaclass is executed, the \ALaTeX{} kernel is loaded, and the
% source file has been processed from the beginning through the first
% |\documentclass| command and all its arguments. The arguments have been
% stored in macros as follows:
% \begin{description}
% \item[\bslash mc@class@options] holds the first optional argument to
% |\documentclass|.
% \item[\bslash mc@class@name] holds the mandatory argument to
% |\documentclass|.
% \item[\bslash mc@class@version] holds the second optional
% argument to |\documentclass|.
% \end{description}
%
% A metaclass can do anything at all with this information. The distributed
% metaclass below emulates \LaTeX's behavior. Code in comments below provides
% two convenient mechanisms to do something else, causing \ALaTeX's typeset
% documents to differ from \LaTeX's. \ALaTeX{} is as flexible as possible, and
% the number of other possibilities is countless.
%
% \DescribeMacro\alt@cls@extension
% \DescribeMacro\ds@foo
% The nonstandard mechanisms are as follows. Let \meta{class} be the class
% named by the |\documentclass| command, \meta{altX} be the value of
% |\alt@cls@extension| defined in the metaclass, and \meta{normX} be the value
% of |\@cls@extension| defined in the \ALaTeX{} (and \LaTeX) kernel.
% \begin{enumerate}
% \item When a file \file{\meta{class}.\meta{altX}} exists in the search path,
% it will be loaded instead of the usual \file{\meta{class}.\meta{normX}}.
% \item When a command |\ds@|\meta{class} is defined, it will be executed
% instead of loading \file{\meta{class}.\meta{normX}}.
% \end{enumerate}
%
% Notice that there is no reason to use \ALaTeX{} unless you create a
% nonstandard metaclass. The standard metaclass emulates standard \LaTeX{}
% because the user should have to take active steps to get nonstandard output.
% If you modify this file, please change the |\fileinfo| declaration near the
% end.
%
% \section{The game of the name}
%
% You may understand the \word{A} in \ALaTeX{} to stand for \word{alternate} or
% \word{abstract}, or to be the definite article, which emphasizes that fact
% that when you process with \ALaTeX{}, you are seeing just one of an infinite
% number of possibile presentations of your document's content.
%
% You may pronounce \ALaTeX{} however you like, of course.
%
% \section{A sampler of applications}
%
% \ALaTeX{} is a powerful tool, but newly born. Sophisticated applications
% have neither been conceived nor implemented. The author would appreciate
% hearing from you.
%
% \ALaTeX{} is potentially useful in situations where without \ALaTeX{} one
% would need to alter the source in a way that affects its presentation but not
% its content. For example, without \ALaTeX{} you must modify the source to
% change the paper size or font characteristics of the typeset document.
% \ALaTeX{} allows you to make this kind of change by altering the typesetting
% procedure instead of the source itself.
%
% You can use \ALaTeX{} to specify options to package and classes or even to
% load packages. You can invoke debugging or profiling code.
%
% Since the metaclass can control the style of a document, a system of files
% could be arranged in which there exist companion files for sources, which
% would function like style sheets. Common hierarchical path searching
% mechanisms would permit cascading styles with a flexible inheritance scheme
% at the levels of site, user, directory, and individual source.
%
% \section{The future}
%
% I envision removing most of the decisions embodied in the preamble and in
% package and class options from the source file to the invocation of the
% processing run. The decisions might be specified on the command line or in
% files separate from the source that are managed by a convenient interface.
% Is not an analogous development occurring as style sheets are brought to
% HTML?
%
% Since the choices a user would typically make via \ALaTeX{} are likely to be
% few and from among a small number of known alternatives, it is easy to
% imagine a convenient user interface for the common options. Such a front end
% written \TeX{} would have the advantage of being \%100 portable. A graphical
% interface could be integrated in an existing front end which manages a broad
% array of \TeX-related tasks.
%
% If metaclasses become tricky, a |\tracingmetaclasses| command might be
% warranted.
%
% \StopEventually{}
%
% \section{Version control}
%
% \begin{macro}{\fileinfo}
% \begin{macro}{\fileversion}
% \begin{macro}{\filedate}
% \begin{macro}{\docdate}
% \begin{macro}{\PPOptArg}
% First we take care of the business of keeping track of the version of this
% document.
% \begin{macrocode}
%<*metaclass>
\def\fileinfo{standard ALaTeX metaclass}
\def\fileversion{v1.0}
\def\filedate{1996/01/24}
\def\docdate{1996/01/24}
\edef\PPOptArg{\filedate\space \fileversion\space \fileinfo}
\ProvidesFile{metaclas.cfg}[\PPOptArg]
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \section{Emulate \LaTeX{} (the default)}
%
% \begin{macro}{\documentclass}
% \begin{macro}{\mc@load@class}
% The following |\documentclass| command behaves exactly like \LaTeX's. It
% looks a little different here because we've already read the three arguments.
% \begin{macrocode}
\def\documentclass{%
\let\documentclass\@twoclasseserror
\if@compatibility\else\let\usepackage\RequirePackage\fi
\mc@load@class}
\def\mc@load@class{%
\edef\reserved@a{%
\noexpand\@fileswithoptions
\noexpand\@clsextension
[\mc@class@options]{\mc@class@name}[\mc@class@version]}%
\reserved@a}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{Privelege alternate extensions}
%
% \begin{macro}{\alt@cls@extension}
% \begin{macro}{\documentclass}
% To enable divergences from standard \LaTeX{} of the first kind only,
% uncomment the following four definitions in this section and ensure that the
% definitions in following sections are commented out. Please also change the
% definition of |\fileinfo| above.
% \begin{macrocode}
% \def\alt@cls@extension{acl}
% \def\documentclass{%
% \let\documentclass\@twoclasseserror
% \if@compatibility\else\let\usepackage\RequirePackage\fi
% \IfFileExists{\mc@class@name.\alt@cls@extension}
% {\let\mc@extension\alt@cls@extension
% \mc@load@class
% \def\mc@extension{\@currext}}
% {\mc@load@class}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\mc@extension}
% \begin{macro}{\@onefilewithoptions}
% A lot of code here for two tiny changes of |\@currext| to |\mc@extension|.
% The file with the alternate extension masquerades as one with the normal
% extension in every way except the actual filename.
% \begin{macrocode}
% \def\mc@extension{\@currext}
% \def\@onefilewithoptions#1[#2][#3]#4{%
% \@pushfilename
% \xdef\@currname{#1}%
% \global\let\@currext#4%
% \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty
% \let\CurrentOption\@empty
% \@reset@ptions
% \makeatletter
% \def\reserved@a{%
% \@ifl@aded\@currext{#1}%
% {\@if@ptions\@currext{#1}{#2}{}%
% {\@latex@error
% {Option clash for \@cls@pkg\space #1}%
% {The package #1 has already been loaded
% with options:\MessageBreak
% \space\space[\@ptionlist{#1.\@currext}]\MessageBreak
% There has now been an attempt to load it
% with options\MessageBreak
% \space\space[#2]\MessageBreak
% Adding the line:\MessageBreak
% \space\space\string\usepackage
% [\@ptionlist{#1.\@currext},#2]{#1}\MessageBreak
% to your document may fix this.\MessageBreak
% Try typing \space <return> \space to proceed.}}}%
% {\@pass@ptions\@currext{#2}{#1}%
% \global\expandafter
% \let\csname ver@\@currname.\@currext\endcsname\@empty
% \InputIfFileExists
% {\@currname.\mc@extension}%
% {}%
% {\@missingfileerror\@currname\mc@extension}%
% \let\@unprocessedoptions\@@unprocessedoptions
% \csname\@currname.\@currext-h@@k\endcsname
% \expandafter\let\csname\@currname.\@currext-h@@k\endcsname
% \@undefined
% \@unprocessedoptions}
% \@ifl@ter\@currext{#1}{#3}{}%
% {\@latex@warning@no@line
% {You have requested,\on@line,
% version\MessageBreak
% `#3' of \@cls@pkg\space #1,\MessageBreak
% but only version\MessageBreak
% `\csname ver@#1.\@currext\endcsname'\MessageBreak
% is available}}%
% \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi
% \@popfilename
% \@reset@ptions}%
% \reserved@a}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \section{Pass control to a macro}
%
% \begin{macro}{\documentclass}
% To enable divergences from standard \LaTeX{} of the second kind only,
% uncomment the following definition and ensure that all definitions in the
% next and previous sections are commented out. Please also change the
% definition of |\fileinfo| above. You must define |\dc@|\meta{class} in your
% \file{metaclass.cfg} or before the |\documentclass| command in your document,
% if you want to define it at all.
% \begin{macrocode}
% \def\documentclass{%
% \let\documentclass\@twoclasseserror
% \if@compatibility\else\let\usepackage\RequirePackage\fi
% \@ifundefined{dc@\mc@class@name}
% {\mc@load@class}
% {\@nameuse{dc@\mc@class@name}}}
% \end{macrocode}
% \end{macro}
%
% \section{First extension then macro}
%
% \begin{macro}{\documentclass}
% To enable divergences from standard \LaTeX{} of both the first and second
% kinds, uncomment the following definition as well as the definitions of
% |\alt@cls@extension|, |\mc@extension|, and |\@onefilewithoptions| above.
% Please also change the definition of |\fileinfo| above.
% \begin{macrocode}
% \def\documentclass{%
% \let\documentclass\@twoclasseserror
% \if@compatibility\else\let\usepackage\RequirePackage\fi
% \IfFileExists{\mc@class@name.\alt@cls@extension}
% {\let\mc@extension\alt@cls@extension
% \mc@load@class
% \def\mc@extension{\@currext}}
% {\@ifundefined{dc@\mc@class@name}
% {\mc@load@class}
% {\@nameuse{dc@\mc@class@name}}}}
% \end{macrocode}
% \end{macro}
%
% \section{Actually do something}
%
% So far we've just defined a command called |\documentclass|. It's time to
% use it. It's probably best if this remains at the end of the (extracted)
% file.
% \begin{macrocode}
\documentclass
% \end{macrocode}
%
% \begin{macrocode}
%</metaclass>
% \end{macrocode}
%
% \appendix
% \section{Perverse cases}
% \label{perverse}
%
% \ALaTeX{} as distributed produces \ext{dvi} files identical to ones that
% \LaTeX{} produces from the same source. Differences are conceivable
% only in the following perverse cases.
% \begin{enumerate}
% \item The document contains \TeX{} code that depends upon the exact
% definitions or undefined state of the macros
% \begin{quote}\raggedright
% |\ALaTeX|, |\documentclass|, |\mc@documentclass|,
% |\mc@@documentclass|, |\mc@class@options|, |\mc@class@name|,
% |\mc@class@version|, and |\mc@load@class|.
% \end{quote}
% \item Processing the document requires the (almost trivial) internal
% resources consumed by defining the above macros and loading the metaclass
% file.
% \item There is unfriendly code in the source before the |\documentclass|
% command. Normally only harmless comments and \env{filecontents}
% environments will precede the |\documentclass| command, but other code is
% possible, that would cause the \ALaTeX's output to differ from \LaTeX's.
% \item The arguments to |\documentclass| are very unusual, for example, they
% change catcodes or have complicated expansions. \ALaTeX{} scans the
% arguments to |\documentclass| slightly differently than \LaTeX{} does.
% \end{enumerate}
% No one should have to worry about these cases, and if they come up the
% problem should be obvious.
%
% \section{Kernel Patch}
%
% This is the code that patches the \LaTeX{} kernel.
%
% \begin{macrocode}
%<*alatex>
\def\fileinfo{ALaTeX patch to LaTeX kernel}
\def\fileversion{v1.0}
\def\filedate{1996/01/24}
\def\docdate{1996/01/24}
\edef\PPOptArg{\filedate\space \fileversion\space \fileinfo}
\ProvidesFile{metaclas.cfg}[\PPOptArg]
\makeatletter
% \end{macrocode}
%
% This is \ALaTeX, so make sure to announce it, and that it's nonstandard. We
% don't want to change the |\fmtversion|. We want \ALaTeX{} to masquerade as
% \LaTeX{} to the programs but not the users.
%
% This startup banner may be further modified by the code in |ltfinal.dtx| if a
% patch file is present.
% \begin{macrocode}
\everyjob{\typeout{ALaTeX\space<\fmtversion\space R1> (NOT STANDARD LATEX)}}
\immediate\write16{ALaTeX\space<\fmtversion\space R1> (NOT STANDARD LATEX)}
% \end{macrocode}
%
% \begin{macro}{\ALaTeX}
% Provide a logo.
% \begin{macrocode}
\DeclareRobustCommand{\ALaTeX}
{A\LaTeX}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\documentclass}
% \begin{macro}{\mc@documentclass}
% \begin{macro}{\mc@@documentclass}
% \begin{macro}{\mc@class@options}
% \begin{macro}{\mc@class@name}
% \begin{macro}{\mc@class@version}
% If the file |metaclas.cfg| exists in the search path, then the
% |\documentclass| command reads its three arguments (two are optional) into
% variables, and passes control to that file. If there is no such file, then
% we proceed just as in \LaTeX. Since |\documentstyle| loads some code then
% calls |\documentclass|, 2.09 documents also fall under the control of the
% metaclass mechanism.
% \begin{macrocode}
\def\documentclass{%
\IfFileExists{metaclas.cfg}
{\@ifnextchar[%]
{\mc@documentclass}
{\mc@documentclass[]}}
{\let\documentclass\@twoclasseserror
\if@compatibility\else\let\usepackage\RequirePackage\fi
\@fileswithoptions\@clsextension}}
\def\mc@documentclass[#1]#2{%
\@ifnextchar[%]
{\mc@@documentclass{#1}{#2}}
{\mc@@documentclass{#1}{#2}[]}}
\def\mc@@documentclass#1#2[#3]{%
\def\mc@class@options{#1}%
\def\mc@class@name{#2}%
\def\mc@class@version{#3}%
\makeatletter
\input{metaclas.cfg}%
\makeatother}
\@onlypreamble\documentclass
\@onlypreamble\mc@documentclass
\@onlypreamble\mc@@documentclass
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% Dump the format.
% \begin{macrocode}
\makeatother
\dump
% \end{macrocode}
%
% \begin{macrocode}
%</alatex>
% \end{macrocode}
%
% \Finale
|