%^^A* file information % \iffalse % % alatex.dtx -- discussion and documentation of ALaTeX and its standard metaclass % % Copyright 1995 Matt Swift . 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 , 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 \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} % % \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} % % \end{macrocode} % % \Finale